让我们说我想构建一个我希望能够在某种程度上杀死它的Spark应用程序。我仍然希望从成功完成的分区中保留数据。我试图通过将其插入Hive表来实现。在(PySpark)伪代码中:
def myExpensiveProcess(x):
...
udfDoExpensiveThing = udf(myExpensiveProcess, StringType())
myDataFrame \
.repartition(100) \
.withColumn("HardEarnedContent", udfDoExpensiveThing("InputColumn")) \
.write.insertInto("SomeExistingHiveTable")
我执行此操作直到完成30个分区,然后我终止了这个工作。当我检查SomeExistingHiveTable
时,我发现它没有新行。
如何保留完成的数据,无论哪些数据没有?
答案 0 :(得分:1)
这是预期和期望的行为,确保输出的一致性。
将数据直接写入文件系统,绕过Spark的数据源API。
myDataFrame \
.repartition(100) \
.withColumn("HardEarnedContent", udfDoExpensiveThing("InputColumn")) \
.rdd \
.foreachPartition(write_to_storage)
其中write_to_storage
实现了所需的逻辑,例如使用one of the HDFS interfaces。