我有Spark SQL查询,可以通过几个小的Parquet文件(大约2M)进行查询。
我的Spark块大小为256 M,因此我想将这些小文件合并为一个(或可能更多)大小为256 M的文件。我在想什么是找到数据帧大小并将其除以256 M,我知道它们将要包含多少个文件,但是很遗憾,Spark不支持查找数据帧的大小,因为它是分布式的。我正在考虑将数据框转换为数据集以列出可以检查它们大小的列表。
答案 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)