将RDD分区写入其自己的目录中的各个镶木地板文件

时间:2015-05-20 00:16:17

标签: scala apache-spark apache-spark-sql rdd parquet

我正在努力解决我想要编写每个RDD分区以将镶木地板文件与其自己的目录分开的步骤。示例将是:

    <root>
        <entity=entity1>
            <year=2015>
                <week=45>
                    data_file.parquet

这种格式的优点是我可以直接在SparkSQL中使用它作为列,我不必在实际文件中重复这些数据。这是获得特定分区而不在其他地方存储单独的分区元数据的好方法。

作为前一步,我从大量gzip文件加载所有数据,并根据上述密钥进行分区。

可能的方法是将每个分区作为单独的RDD然后写入,但我找不到任何好的方法。

任何帮助将不胜感激。顺便说一下,我是这个堆栈的新手。

2 个答案:

答案 0 :(得分:48)

我不认为接受的答案会恰当地回答这个问题。

尝试这样的事情:

df.write.partitionBy("year", "month", "day").parquet("/path/to/output")

您将获得分区目录结构。

答案 1 :(得分:2)

我认为可以通过在要保存的RDD上调用foreachPartition(f: Iterator[T] => Unit)来实现。

您在foreachPartition中提供的功能:

  1. 准备路径hdfs://localhost:9000/parquet_data/year=x/week=y
  2. a ParquetWriter
  3. 通过将每行插入recordWriter来耗尽迭代器。
  4. 清理