重新分区以避免大量小文件

bwleehnv  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(348)

目前我有一个etl作业,它读取很少的表,执行某些转换并将它们写回daily表。
我在spark sql中使用以下查询“insert into dbname.tablename partition(year\u month)select*from spark\u temp\u table”将插入所有这些记录的目标表按year x month级别进行分区。每天生成的记录并不多,因此我在年x月级别进行分区。
但是,当我检查分区时,我的代码每天运行大约50mb的文件(代码必须每天运行),最终我的分区中会有大约30个文件,总计约1500mb
我想知道是否有办法只在一个分区中创建一个(或者根据块大小限制创建2-3个文件),同时每天追加记录
我想我能做的就是读取sparkDataframe中相关分区的所有内容,用最新记录附加它,然后在写回之前重新分区。如何确保我只从相关分区读取数据,并且只有该分区使用较少的文件进行了重写?

btxsgosb

btxsgosb1#

你可以用 DISTRIBUTE BY 子句来控制如何在每个分区内的文件中分发记录。
要使每个分区有一个文件,可以使用 DISTRIBUTE BY year, month 要使每个分区有3个文件,可以使用 DISTRIBUTE BY year, month, day % 3 完整查询:

INSERT INTO dbname.tablename 
PARTITION(year_month) 
SELECT * from Spark_temp_table
DISTRIBUTE BY year, month, day % 3

相关问题