[英]Add New Partition to Hive External Table via databricks
我有一个文件夹,它以前有基于ingestiontime
时间的子文件夹,这也是其 Hive 表中使用的原始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/....
........
在每个 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
分区中的数据添加到我当前的hive表中。
为了实现这一点,我正在运行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`.;
我在这里做错了什么?
提前致谢。
由于您已经在使用 Databricks 并且这是一个流用例,因此您绝对应该认真考虑使用 Delta Lake 表。
您不必搞乱显式... ADD PARTITION 和 MSCK 语句。 具有 ACID 属性的 Delta Lake 将确保您的数据正确提交,如果您的工作失败,您最终不会得到部分结果。 一旦数据被提交,它就可供用户使用(同样没有 MSCK 和 ADD PARTITION)语句。
只需在 DDL 中将“USING PARQUET”更改为“USING DELTA”即可。
您还可以(转换)现有 parquet 表到 Delta Lake 表,然后从 Spark 批处理和结构化流作业开始使用 INSERT、UPDATE、DELETE、MERGE INTO、COPY INTO。 OPTIMIZE 将清理小文件问题。
alter table gp_hive_table add partition
是将分区(数据位置,不是新列)添加到已经定义分区方案的表中,它不会改变当前的分区方案,它只是添加分区元数据,在某个位置有对应于某个的分区分区列值。
如果要更改分区列,则需要重新创建表。:
删除(检查它是外部的)表: DROP TABLE gp_hive_table;
使用新的分区列创建表。 不会自动创建分区。
现在您可以使用ALTER TABLE ADD PARTITION
或使用MSCK REPAIR TABLE根据目录结构自动创建分区。 在执行这些命令之前,目录结构应该已经匹配分区方案
因此,基于@leftjoin 的建议,
我没有将没有businessname
的hive表作为分区之一,而是-
步骤 1 -> 使用 - PARTITION BY (businessname long,ingestiontime long)
创建 hive 表
第 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>
这解决了我的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.