实木复合地板的位置是:
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
答案 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,那么您将遇到严重的问题,它将严重损害性能。