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

Apache spark 如何可靠地写入和恢复分区数据,apache-spark,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)) .repart

我正在寻找一种编写和恢复分区数据集的方法。就这个问题而言,我可以接受两个分区的
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")
我曾考虑将分区的
数据集
写入拼花地板,但我相信Spark没有使用这些信息


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

这可能是由bucketBy在dataframe/dataset api中实现的,但有一个问题-直接保存到拼花地板不起作用,只有saveAsTable起作用

Dataset-parquet=。。。;
拼花地板
.bucketBy(1000,“col1”,“col2”)
.分割人(“col3”)
.saveAsTable(“表名”);
sparkSession.read().table(“tableName”);

spark core的另一种方法是使用自定义RDD,例如,请参阅-即,在阅读hdfs RDD之后,您可能需要重新设置分区器,但它有点粗糙,并且本机不支持(因此需要针对每个spark版本进行调整)

@LosInOverflow,所以它不适合您?你不同意吗?老实说,我不同意:(我仍然在计划中看到一个混乱。RDD解决方案看起来很有趣,但很难破解…但这是唯一的答案,所以你今天很幸运:)@LostInOverflow,你能发布你是如何验证它的吗?
spark.range(10000)。withColumn(“foo”,lit(1)).repartition(100,$“id”).write.bucketBy(100,“id”).mode)(“覆盖”).saveAsTable(“foo”);spark.read.table(“foo”)。重新分区(100,$“id”).explain
我认为您可能需要检查以相同方式扣合的两个表,然后加入它们。我认为重新分区将在没有任何扣合通知的情况下洗牌。另一个问题-您正在使用相同的spark上下文进行测试,而通常您将在另一个会话中加载表(因为作业每天运行一次)要完成这项工作,必须使用配置单元支持和持久元存储支持(默认值在内存中,并且仅作为jvm使用)