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使用)