通过数据块向Hive外部表添加新分区

我有一个文件夹,该文件夹以前具有基于ingestiontime的子文件夹,这也是其配置单元表中使用的原始PARTITION

所以文件夹看起来像-

s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200712230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200711230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200710230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200709230000/....
........

在每个摄入时间文件夹中,数据以ParqUET格式显示。

现在,在同一myStreamingData文件夹中,我要在另一个名为businessname的文件夹中添加另一个保存相似数据的文件夹。

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

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分区中的数据添加到当前配置单元表中。

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

%sql
alter table gp_hive_table add partition (businessname=007,ingestiontime=20200712230000) location "s3://MyDevBucket/dev/myStreamingData/businessname=007/ingestiontime=20200712230000"

但是我收到此错误-

Error in SQL statement: AnalysisException: businessname is not a valid partition column in table `default`.`gp_hive_table`.;

我在哪里做错了什么?

预先感谢。

iCMS 回答:通过数据块向Hive外部表添加新分区

由于您已经在使用Databricks,并且这是一个流使用案例,所以您绝对应该认真考虑使用Delta Lake表。

您将不必弄乱明确的... ADD PARTITION和MSCK语句。 带有ACID属性的Delta Lake将确保您的数据正确提交,如果您的工作失败,您将不会获得部分结果。一旦提交了数据,用户就可以使用该数据(同样没有MSCK和ADD PARTITION)语句。

只需在DDL中将“使用参数”更改为“使用三角洲”即可。

您还可以将现有的实木复合地板表转换为Delta Lake表,然后从Spark批处理和结构化流作业开始使用INSERT,UPDATE,DELETE,MERGE INTO,COPY INTO。优化将清除小文件问题。

,

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

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

  1. 删除(检查是否为EXTERNAL)表:DROP TABLE gp_hive_table;

  2. 使用新的分区列创建表。分区不会自动创建。

  3. 现在,您可以使用ALTER TABLE ADD PARTITION添加分区,也可以使用MSCK REPAIR TABLE根据目录结构自动创建分区。在执行这些命令之前,目录结构应该已经符合分区方案

,

所以, 以@leftjoin的建议为基础,

与其将没有businessname的配置单元表作为分区之一, 我所做的是-

步骤1 ->使用-PARTITION BY (businessname long,ingestiontime long)

创建配置单元表

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

第3步-> 现在,有一些ingestiontime文件夹,不在企业名称文件夹中,即 像-

这样的文件夹
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>

这解决了我的问题。

本文链接:https://www.f2er.com/1946820.html

大家都在问