所以,我有一个用例,我想复制表的最后一个分区,并用新的分区列值将它插入到同一个表中。
需要注意的是,最后一个分区值总是已知的。
我可以想出两种方法
得到 where partitionColumn = partitionValue
在一个 DataFrame
并使用 .withColumn
然后 saveAsTable
然后执行失效/刷新
或者,
复制 parquet
最后一个分区目录中的文件
创建新分区,将其粘贴到新目录中 /newPatritionValue/
最后
粘贴Parquet文件
跑 ALTER TABLE
哪个跑得更快?
1条答案
按热度按时间hfsqlsce1#
我认为方法1会有一些额外的开销。spark可能会尝试以不同的方式写入文件(可能是文件数或压缩,甚至是一些模式修改),因为从它的Angular 来看,您正在读取一个数据集,然后输出另一个数据集。
使用方法2,您只需将文件复制到另一个文件夹,复制后的数据将完全相同。你甚至可以替换你的
ALTER TABLE .. ADD PARTITION .. LOCATION ..
与MSCK REPAIR TABLE ..
,它将使您的代码更干净,因为传递的参数更少。你(和你的团队)的偏好也很重要。如果您的所有工作流都已经在spark中,那么从长远来看,添加其他类型的作业会造成更大的危害。