目前我有一个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中相关分区的所有内容,用最新记录附加它,然后在写回之前重新分区。如何确保我只从相关分区读取数据,并且只有该分区使用较少的文件进行了重写?
1条答案
按热度按时间btxsgosb1#
你可以用
DISTRIBUTE BY
子句来控制如何在每个分区内的文件中分发记录。要使每个分区有一个文件,可以使用
DISTRIBUTE BY year, month
要使每个分区有3个文件,可以使用DISTRIBUTE BY year, month, day % 3
完整查询: