繁体   English   中英

通过databricks将新分区添加到Hive外部表

[英]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是将分区(数据位置,不是新列)添加到已经定义分区方案的表中,它不会改变当前的分区方案,它只是添加分区元数据,在某个位置有对应于某个的分区分区列值。

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

  1. 删除(检查它是外部的)表: DROP TABLE gp_hive_table;

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

  3. 现在您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM