将 RDD 分区写入其自己目录中的单个 parquet 文件
Writing RDD partitions to individual parquet files in its own directory
我正在努力解决我想将每个 RDD 分区写入以将镶木地板文件与其自己的目录分开的步骤。示例将是:
<root>
<entity=entity1>
<year=2015>
<week=45>
data_file.parquet
这种格式的优点是我可以直接在 SparkSQL 中将其用作列,而不必在实际文件中重复这些数据。这将是获得特定分区的好方法,而无需在其他地方存储单独的分区元数据。
作为前面的步骤,我从大量 gzip 文件中加载了所有数据,并根据上述键进行了分区。
可能的方法是将每个分区作为单独的 RDD,然后写入它,尽管我找不到任何好的方法。
如有任何帮助,我们将不胜感激。顺便说一句,我是这个堆栈的新手。
我认为可以通过在要保存的 RDD 上调用 foreachPartition(f: Iterator[T] => Unit)
来实现。
在您提供的函数中 foreachPartition
:
- 准备路径
hdfs://localhost:9000/parquet_data/year=x/week=y
- 一个ParquetWriter
- 通过将每一行插入到 recordWriter 来耗尽 Iterator。
- 清理
我认为接受的答案没有恰当地回答问题。
尝试这样的事情:
df.write.partitionBy("year", "month", "day").parquet("/path/to/output")
您将得到分区的目录结构。
我正在努力解决我想将每个 RDD 分区写入以将镶木地板文件与其自己的目录分开的步骤。示例将是:
<root>
<entity=entity1>
<year=2015>
<week=45>
data_file.parquet
这种格式的优点是我可以直接在 SparkSQL 中将其用作列,而不必在实际文件中重复这些数据。这将是获得特定分区的好方法,而无需在其他地方存储单独的分区元数据。
作为前面的步骤,我从大量 gzip 文件中加载了所有数据,并根据上述键进行了分区。
可能的方法是将每个分区作为单独的 RDD,然后写入它,尽管我找不到任何好的方法。
如有任何帮助,我们将不胜感激。顺便说一句,我是这个堆栈的新手。
我认为可以通过在要保存的 RDD 上调用 foreachPartition(f: Iterator[T] => Unit)
来实现。
在您提供的函数中 foreachPartition
:
- 准备路径
hdfs://localhost:9000/parquet_data/year=x/week=y
- 一个ParquetWriter
- 通过将每一行插入到 recordWriter 来耗尽 Iterator。
- 清理
我认为接受的答案没有恰当地回答问题。
尝试这样的事情:
df.write.partitionBy("year", "month", "day").parquet("/path/to/output")
您将得到分区的目录结构。