如何更新ORC流接收器中的现有条目?

时间:2018-11-16 14:29:22

标签: apache-spark spark-structured-streaming orc

使用Apache ORC文件格式将流持久保存到文件中时,是否可以对条目执行更新?在更新条目时,无需多次附加并有效地拥有条目。

incomingStreamDF.writeStream
  .format("orc")
  .option("path", "/mnt/adls/orc")
  .option("checkpointLocation", "/mnt/adls/orc/check")
  .trigger(ProcessingTime("25 seconds"))
  .start()

似乎ORC支持更新,所以有一种方法可以在writeStream选项中指示条目的键。

1 个答案:

答案 0 :(得分:3)

tl; dr 否(最高至Spark 2.4)

可以为您提供这种功能的唯一输出模式是Update输出模式。由于orc的格式是must always be used with Append output mode,是FileFormat


该问题的解决方案可能是使用全新的DataStreamWriter.foreachBatch运算符(或较旧的DataStreamWriter.foreach)在其中处理所需的数据(并且您可以轻松地在ORC中更新条目)文件(如果您知道如何操作)。

  

foreachBatch(函数:(数据集[T],长整数⇒单位):DataStreamWriter [T]

     

设置要使用提供的function处理的流查询的输出。

     

仅在微批量执行模式下(即,触发器不连续时)才支持。

     

在每个微批处理中,将使用以下命令调用提供的函数:

     

(i)将输出行作为数据集

     

(ii)批次标识符。

     

可以使用batchId进行重复数据删除,并将输出(即提供的数据集)以事务方式写入外部系统。

     

对于相同的batchId,保证输出数据集完全相同(假定查询中的所有操作都是确定性的)。