我正在寻找一种编写和恢复分区数据集的方法。出于这个问题的目的,我可以接受分区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并没有使用这些信息。
我只能使用磁盘存储而不是数据库或数据网格。
答案 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并且本身不支持(所以需要调整它)每个火花版本)