在Spark中将文件写入S3时是否应该避免使用partitionBy?

时间:2020-01-15 12:46:43

标签: scala apache-spark amazon-s3 apache-spark-sql parquet

实木复合地板的位置是:

s3://mybucket/ref_id/date/camera_id/parquet-file

假设我有ref_id x3,date x 4,camera_id x 500,如果我像下面这样写木地板(使用partitionBy),我将得到{ 1}}个文件上传到S3。这比将几个文件写入顶级存储桶(没有多级前缀)的速度要慢得多

最佳做法是什么?我的同事认为3x4x500=6000与Hive metastore / table一起使用是一件好事

partitionBy

1 个答案:

答案 0 :(得分:2)

如果问题太多,这似乎是事实,那么在编写RDD /数据帧之前,需要对其进行重新分区。每个RDD / Dataframe分区将为每个文件夹生成1个文件。

df.repartition(1)\
 .write.mode("overwrite")\
 .partitionBy('ref_id','date','camera_id')\
 .parquet('s3a://mybucket/tmp/test_data')

除了repartition以外,您还可以使用coalesce


如果(重新分区为1之后)文件太小,则需要减少目录结构。实木复合地板文档建议文件大小在500Mb和1Gb之间。

https://parquet.apache.org/documentation/latest/

我们建议使用较大的行组(512MB-1GB)。由于整行 组可能需要阅读,我们希望它完全适合一个HDFS

如果文件只有几Kb或Mb,那么您将遇到严重的问题,它将严重损害性能。