【发布时间】:2018-12-28 13:44:51
【问题描述】:
拥有一个已分区的 Hive 表
CREATE EXTERNAL TABLE IF NOT EXISTS CUSTOMER_PART (
NAME string ,
AGE int ,
YEAR INT)
PARTITIONED BY (CUSTOMER_ID decimal(15,0))
STORED AS PARQUET LOCATION 'HDFS LOCATION'
第一个 LOAD 是使用
通过 PYSPARK 从 ORACLE 到 HIVE 完成的INSERT OVERWRITE TABLE CUSTOMER_PART PARTITION (CUSTOMER_ID) SELECT NAME, AGE, YEAR, CUSTOMER_ID FROM CUSTOMER;
它工作正常并在运行期间动态创建分区。现在每天增量加载数据会为分区下的单个记录创建单独的文件。
INSERT INTO TABLE CUSTOMER_PART PARTITION (CUSTOMER_ID = 3) SELECT NAME, AGE, YEAR FROM CUSTOMER WHERE CUSTOMER_ID = 3; --Assume this gives me the latest record in the database
是否有可能将该值附加到分区下的现有 parquet 文件中,直到达到其块大小,而无需为每个插入创建较小的文件。
重写整个分区是一种选择,但我不想这样做
INSERT OVERWRITE TABLE CUSTOMER_PART PARTITION (CUSTOMER_ID = 3) SELECT NAME, AGE, YEAR FROM CUSTOMER WHERE CUSTOMER_ID = 3;
为 Hive 设置了以下属性
set hive.execution.engine=tez; -- TEZ execution engine
set hive.merge.tezfiles=true; -- Notifying that merge step is required
set hive.merge.smallfiles.avgsize=128000000; --128MB
set hive.merge.size.per.task=128000000; -- 128MB
这对日常插入仍然没有帮助。任何可以遵循的替代方法都会非常有帮助。
【问题讨论】:
-
“是否有可能将值附加到现有的 parquet 文件中” >> 否。 HDFS 存储不可变文件(带有附加/截断 CSV 文件的边缘情况)。诸如 Parquet 之类的列格式以一种复杂的方式存储它们的数据,并带有一个终止文件的“页脚”(带有用于连接现有文件片段和重建页脚的边缘情况)。从 Uber 工程博客中搜索“Hoodie”/“Hudi”(他们在某些时候更改了项目名称),以了解问题以及进行增量更新的复杂程度......跨度>
标签: hive pyspark pyspark-sql parquet