我有一个以前有基于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`.;我在这里做错了什么?
提前谢谢。
发布于 2020-07-31 11:23:56
所以,根据左撇子的建议,
没有一个没有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>
这解决了我的问题。
发布于 2020-08-02 01:01:29
由于您已经在使用Databricks,而且这是一个流用例,因此您肯定应该认真考虑使用Delta表。
你不用去惹露骨.添加分区和MSCK语句。带有ACID属性的Delta将确保正确提交数据,如果您的工作失败,则不会得到部分结果。一旦提交了数据,用户就可以使用它(同样没有MSCK和ADD分区)语句。
只需将“使用地板”改为“使用三角洲”在您的DDL。
您还可以(将)现有的地板表转换为Delta表,然后开始使用INSERT、UPDATE、DELETE、合并、复制、从Spark批处理和结构化流作业。优化将清理小文件问题。
发布于 2020-07-13 19:19:34
alter table gp_hive_table add partition是用已定义的分区方案向表中添加分区(数据位置,而不是新列),它不改变当前的分区方案,它只是添加分区元数据,在某个位置有对应于某些分区列值的分区。
如果要更改分区列,则需要重新创建表。
表:DROP TABLE gp_hive_table; (检查它是外部的)
ALTER TABLE ADD PARTITION添加分区,或者使用MSCK REPAIR TABLE根据目录结构自动创建分区。在执行这些命令之前,目录结构应该已经匹配分区方案。
https://stackoverflow.com/questions/62874307
复制相似问题