如何可靠地写入和恢复分区数据

时间:2016-10-05 22:48:14

标签: apache-spark

我正在寻找一种编写和恢复分区数据集的方法。出于这个问题的目的,我可以接受分区RDD

val partitioner: org.apache.spark.Partitioner = ???
rdd.partitionBy(partitioner)

Dataset[Row] / Dataframe

df.repartition($"someColumn")

目标是在数据恢复时避免随机播放。例如:

spark.range(n).withColumn("foo", lit(1))
  .repartition(m, $"id")
  .write
  .partitionBy("id")
  .parquet(path)

不应该需要随机播放:

spark.read.parquet(path).repartition(m, $"id")

我考虑过将分区Dataset写入Parquet,但我相信Spark并没有使用这些信息。

我只能使用磁盘存储而不是数据库或数据网格。

1 个答案:

答案 0 :(得分:3)

这可能是通过数据框/数据集api中的bucketBy来实现的,但是有一个问题 - 直接保存到镶木地板上不起作用,只有saveAsTable可以工作。

Dataset<Row> parquet =...;
parquet.write()
  .bucketBy(1000, "col1", "col2")
  .partitionBy("col3")
  .saveAsTable("tableName");

sparkSession.read().table("tableName");

火花核心的另一个应用是使用自定义RDD,例如参见https://github.com/apache/spark/pull/4449 - 即在阅读hdfs rdd之后你会设置分区器,但它有点hacky并且本身不支持(所以需要调整它)每个火花版本)