进行分区以避免大量小文件

时间:2018-10-20 11:41:04

标签: apache-spark hadoop apache-spark-sql pyspark-sql

当前,我有一个ETL作业,该作业读取几张表,执行某些转换并将它们写回到每日表中。

我在spark sql中使用以下查询      “将INSERT INTO dbname.tablename PARTITION(year_month)             SELECT * from Spark_temp_table“ 插入所有这些记录的目标表按X年级分区。每天生成的记录并不多,因此我按X年的月份级别进行划分。

但是,当我检查分区时,我的代码每天运行大约50MB的文件(代码必须每天运行),最终我最终将在分区中拥有大约30个文件,总计约1500MB

我想知道是否有办法在我每天添加记录的同时在一个分区中创建一个(或每个块大小限制为2-3个文件)

我认为我可以做到的方式是,从我的spark数据帧中的相关分区中读取所有内容,将其附加最新记录,然后在写回之前重新分区。如何确保仅从相关分区读取数据,并且只有该分区被较少数量的文件覆盖?

1 个答案:

答案 0 :(得分:0)

您可以使用Identi DeliveryType Status MessageCount Velocity RiskLevel OutboundIPPool NextH ty opDom ain ------ ------------ ------ ------------ -------- --------- -------------- ----- xy... SmtpDeliv... Ready 0 0 Normal 0 ma... xy... SmtpDeliv... Ready 0 0 Normal 0 ma... xy... SmtpDeliv... Ready 0 0 Normal 0 ma... xy... SmtpDeliv... Ready 0 0 Normal 0 ma... xy... SmtpRelay... Ready 0 0 Normal 0 ed... xy... Undefined Ready 0 0 Normal 0 Su... xy... ShadowRed... Ready 20 0 Normal 0 gr... 子句来控制记录在每个分区内的文件中的分布方式。

要在每个分区中只有一个文件,可以使用DISTRIBUTE BY

要在每个分区中拥有3个文件,您可以使用DISTRIBUTE BY year, month

完整查询:

DISTRIBUTE BY year, month, day % 3