首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过数据库向Hive外部表添加新的分区

通过数据库向Hive外部表添加新的分区
EN

Stack Overflow用户
提问于 2020-07-13 10:52:48
回答 3查看 2.9K关注 0票数 2

我有一个以前有基于ingestiontime的子文件夹的文件夹,它也是它的Hive中使用的原始PARTITION

所以文件夹看起来-

代码语言:javascript
复制
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200712230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200711230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200710230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200709230000/....
........

在每个ingestiontime文件夹中,数据以PARQUET格式显示。

现在,在同一个myStreamingData文件夹中,我要添加另一个文件夹,该文件夹包含类似的数据,但位于名为businessname的文件夹中。

所以我的文件夹结构现在看起来-

代码语言:javascript
复制
s3://MyDevBucket/dev/myStreamingData/businessname=007/ingestiontime=20200712230000/....
s3://MyDevBucket/dev/myStreamingData/businessname=007/ingestiontime=20200711230000/....
s3://MyDevBucket/dev/myStreamingData/businessname=007/ingestiontime=20200710230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200712230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200711230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200710230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200709230000/....
    ........

因此,我也需要将businessname分区中的数据添加到当前的hive表中。

为此,我运行了ALTER查询-(在Databricks上)

代码语言:javascript
复制
%sql
alter table gp_hive_table add partition (businessname=007,ingestiontime=20200712230000) location "s3://MyDevBucket/dev/myStreamingData/businessname=007/ingestiontime=20200712230000"

但我发现了这个错误-

代码语言:javascript
复制
Error in SQL statement: AnalysisException: businessname is not a valid partition column in table `default`.`gp_hive_table`.;

我在这里做错了什么?

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-31 11:23:56

所以,根据左撇子的建议,

没有一个没有businessname作为分区的蜂窝表,我所做的是-

步骤1 ->使用- PARTITION BY (businessname long,ingestiontime long)创建蜂窝表

步骤2 ->执行查询- MSCK REPAIR <Hive_Table_name>自动添加分区。

步骤3 ->现在,有一些不存在于业务名称文件夹中的ingestiontime文件夹,如-

代码语言:javascript
复制
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200712230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200711230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200710230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200709230000/....

我编写了一小部分代码来获取所有这样的分区,然后对所有这些分区运行以下查询-- ALTER TABLE <hive_table_name> ADD PARTITION (businessname=<some_value>,ingestiontime=<ingestion_time_partition_name>) LOCATION "<s3_location_of_all_partitions_not_belonging_to_a_specific_businesskey>

这解决了我的问题。

票数 0
EN

Stack Overflow用户

发布于 2020-08-02 01:01:29

由于您已经在使用Databricks,而且这是一个流用例,因此您肯定应该认真考虑使用Delta表。

你不用去惹露骨.添加分区和MSCK语句。带有ACID属性的Delta将确保正确提交数据,如果您的工作失败,则不会得到部分结果。一旦提交了数据,用户就可以使用它(同样没有MSCK和ADD分区)语句。

只需将“使用地板”改为“使用三角洲”在您的DDL。

您还可以(将)现有的地板表转换为Delta表,然后开始使用INSERT、UPDATE、DELETE、合并、复制、从Spark批处理和结构化流作业。优化将清理小文件问题。

票数 2
EN

Stack Overflow用户

发布于 2020-07-13 19:19:34

alter table gp_hive_table add partition是用已定义的分区方案向表中添加分区(数据位置,而不是新列),它不改变当前的分区方案,它只是添加分区元数据,在某个位置有对应于某些分区列值的分区。

如果要更改分区列,则需要重新创建表。

表:DROP TABLE gp_hive_table; (检查它是外部的)

  1. 拖放

  1. 创建具有新分区列的表。分区不会被创建为automatically.

  1. 现在您可以使用ALTER TABLE ADD PARTITION添加分区,或者使用MSCK REPAIR TABLE根据目录结构自动创建分区。在执行这些命令

之前,目录结构应该已经匹配分区方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62874307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档