Apache Spark Streaming:如何比较2个dstream中的2个数据帧

时间:2017-02-16 12:36:57

标签: apache-spark spark-streaming spark-dataframe

我是Apache Spark的初学者。我正在尝试运行一个流作业,它接收一些数据,将其转换为数据帧并运行一些处理,如加入和删除重复项等。现在我必须缓存这个已处理的数据,以便我可以将其附加到下一个dstream(使用一些union / join)并再次进行处理。

我尝试使用dataframe.cache()缓存并在下一个批处理中重新使用它。

例如,如果df是由dstream形成的rdd。

   foreachrdd{
new =df.unionAll(processed)
new.registerTempTable("TableScheme")
sql.( //perform inner join and some other processing)
processed=new
processed.cache();

}

当我们执行Dataframe.cache或Dataframe.persist()时,我们是否缓存了实际数据或应用的DAG /转换?当第二个流来时,我的程序退出

Caused by: org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
org.apache.spark.SparkException: Attempted to use BlockRDD[1] at socketTextStream after its blocks have been removed!

1 个答案:

答案 0 :(得分:0)

cache()功能执行DAG中定义的处理,直到cache()调用并适当地存储数据,以便在不执行多个操作的情况下不重复计算。

你想要的是跨流批次的一些持久性。

有几种方法可以做到这一点:

您选择的方法在很大程度上取决于您的用例。