我有一个文件夹,以前有子文件夹的基础上 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`.;
我在这里做的哪一部分不对?
提前谢谢。
3条答案
按热度按时间kkbh8khc1#
既然您已经在使用databricks了,而且这是一个流式用例,那么您肯定应该认真考虑使用delta-lake表。
你就不必去搞清楚。。。添加分区和msck语句。具有acid属性的delta-lake将确保您的数据被正确提交,如果您的作业失败,您将不会得到部分结果。一旦提交了数据,用户就可以使用它(同样不使用msck和add partition)语句。
只需在ddl中将“using parquet”改为“using delta”。
您还可以(转换)您现有的Parquet表,以三角湖表,然后开始使用插入,更新,删除,合并到,复制到,从Spark批和结构化流作业。优化将清除小文件问题。
camsedfj2#
alter table gp_hive_table add partition
就是给已经定义了分区方案的表添加分区(数据位置,不是新列),它不改变当前的分区方案,只添加分区元数据,即在某个位置有分区对应某个分区列值。如果要更改分区列,则需要重新创建表:
删除(检查是否在外部)表:
DROP TABLE gp_hive_table;
创建具有新分区列的表。分区不会自动创建。现在可以使用
ALTER TABLE ADD PARTITION
或者使用msck修复表根据目录结构自动创建它们。在执行这些命令之前,目录结构应该已经与分区方案匹配yvt65v4c3#
基于@leftjoin的建议,
而不是一张没有
businessname
作为一个分区,我所做的是-步骤1->创建配置单元表-
PARTITION BY (businessname long,ingestiontime long)
步骤2->执行查询-MSCK REPAIR <Hive_Table_name>
自动添加分区。步骤3->现在,有ingestiontime文件夹不在文件夹businessname中,例如-
我写了一小段代码来获取所有这样的分区,然后对所有分区运行以下查询-
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>
这解决了我的问题。