【发布时间】:2015-10-01 21:56:57
【问题描述】:
我有一份工作需要以 parquet/avro 格式保存所有工作节点的结果。我可以为每个单独的分区创建一个单独的 parquet 文件并将所有生成的文件作为一个表读取吗?或者有没有更好的方法来解决这个问题? 输入分为 96 个分区,结果需要保存在 HDFS 上。当我尝试将其保存为文件时,它创建了超过一百万个小文件。
【问题讨论】:
标签: apache-spark hadoop-yarn parquet
我有一份工作需要以 parquet/avro 格式保存所有工作节点的结果。我可以为每个单独的分区创建一个单独的 parquet 文件并将所有生成的文件作为一个表读取吗?或者有没有更好的方法来解决这个问题? 输入分为 96 个分区,结果需要保存在 HDFS 上。当我尝试将其保存为文件时,它创建了超过一百万个小文件。
【问题讨论】:
标签: apache-spark hadoop-yarn parquet
您可以在调用write 之前对所需数量的分区执行repartition(或coalesce,如果您总是想要更少的分区)。然后,您的数据将被写入相同数量的文件中。当您想读入数据时,您只需指向包含文件的文件夹而不是特定文件。像这样:
sqlContext.read.parquet("s3://my-bucket/path/to/files/")
【讨论】:
repartition 不会删除任何数据,它只会将数据随机排列到所需数量的分区中。第三,您确实可以使用coalesce 而不是repartition(我已经用这个更新了我的答案)。