通过小型镶木地板文件发火花,我需要将它们组合到一个文件中

时间:2019-06-18 19:30:08

标签: apache-spark

我有Spark SQL查询,可以通过几个小的Parquet文件(大约2M)进行查询。

我的Spark块大小为256 M,因此我想将这些小文件合并为一个(或可能更多)大小为256 M的文件。我在想什么是找到数据帧大小并将其除以256 M,我知道它们将要包含多少个文件,但是很遗憾,Spark不支持查找数据帧的大小,因为它是分布式的。我正在考虑将数据框转换为数据集以列出可以检查它们大小的列表。

1 个答案:

答案 0 :(得分:1)

您要查找的函数是Size Estimator,它将返回文件的字节数。当涉及到文件和文件数量时,Spark太可怕了。要控制输出的文件数,您将要运行repartition命令,因为Spark的输出文件数与对象具有的分区数直接相关。在下面的示例中,我要估算任意输入数据帧的大小,找到分区的“真实”数量(+1的原因是long上的Spark,而int本质上会四舍五入,因此0个分区是不可能的。

希望这会有所帮助!

import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.types._ 
import org.apache.spark.sql.DataFrame 
import org.apache.spark.util.SizeEstimator 

val inputDF2 : Long = SizeEstimator.estimate(inputDF.rdd) 
//find its appropiate number of partitions 
val numPartitions : Long = (inputDF2/134217728) + 1 
//write it out with that many partitions  
val outputDF = inputDF.repartition(numPartitions.toInt)