通过databricks向配置单元外部表添加新分区

fzwojiic  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(886)

我有一个文件夹,以前有子文件夹的基础上 ingestiontime 这也是原作 PARTITION 在它的Hive表中使用。
所以文件夹看起来像-

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的文件夹中。
所以我的文件夹结构现在看起来像-

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`.;

我在这里做的哪一部分不对?
提前谢谢。

kkbh8khc

kkbh8khc1#

既然您已经在使用databricks了,而且这是一个流式用例,那么您肯定应该认真考虑使用delta-lake表。
你就不必去搞清楚。。。添加分区和msck语句。具有acid属性的delta-lake将确保您的数据被正确提交,如果您的作业失败,您将不会得到部分结果。一旦提交了数据,用户就可以使用它(同样不使用msck和add partition)语句。
只需在ddl中将“using parquet”改为“using delta”。
您还可以(转换)您现有的Parquet表,以三角湖表,然后开始使用插入,更新,删除,合并到,复制到,从Spark批和结构化流作业。优化将清除小文件问题。

camsedfj

camsedfj2#

alter table gp_hive_table add partition 就是给已经定义了分区方案的表添加分区(数据位置,不是新列),它不改变当前的分区方案,只添加分区元数据,即在某个位置有分区对应某个分区列值。
如果要更改分区列,则需要重新创建表:
删除(检查是否在外部)表: DROP TABLE gp_hive_table; 创建具有新分区列的表。分区不会自动创建。
现在可以使用 ALTER TABLE ADD PARTITION 或者使用msck修复表根据目录结构自动创建它们。在执行这些命令之前,目录结构应该已经与分区方案匹配

yvt65v4c

yvt65v4c3#

基于@leftjoin的建议,
而不是一张没有 businessname 作为一个分区,我所做的是-
步骤1->创建配置单元表- PARTITION BY (businessname long,ingestiontime long) 步骤2->执行查询- MSCK REPAIR <Hive_Table_name> 自动添加分区。
步骤3->现在,有ingestiontime文件夹不在文件夹businessname中,例如-

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> 这解决了我的问题。

相关问题