将行插入到Hive中,因为它们是在Spark中计算的

时间:2017-11-05 14:36:24

标签: hadoop apache-spark hive

让我们说我想构建一个我希望能够在某种程度上杀死它的Spark应用程序。我仍然希望从成功完成的分区中保留数据。我试图通过将其插入Hive表来实现。在(PySpark)伪代码中:

def myExpensiveProcess(x):
 ...

udfDoExpensiveThing = udf(myExpensiveProcess, StringType())

myDataFrame \
  .repartition(100) \
  .withColumn("HardEarnedContent", udfDoExpensiveThing("InputColumn")) \
  .write.insertInto("SomeExistingHiveTable")

我执行此操作直到完成30个分区,然后我终止了这个工作。当我检查SomeExistingHiveTable时,我发现它没有新行。

如何保留完成的数据,无论哪些数据没有?

1 个答案:

答案 0 :(得分:1)

这是预期和期望的行为,确保输出的一致性。

将数据直接写入文件系统,绕过Spark的数据源API。

myDataFrame \
  .repartition(100) \
  .withColumn("HardEarnedContent", udfDoExpensiveThing("InputColumn")) \
  .rdd \
  .foreachPartition(write_to_storage)

其中write_to_storage实现了所需的逻辑,例如使用one of the HDFS interfaces