【问题标题】:Apache Spark Streaming : How to compare 2 dataframes in 2 dstreamsApache Spark Streaming:如何比较 2 个 dstream 中的 2 个数据帧
【发布时间】:2017-02-16 12:36:57
【问题描述】:

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

我尝试使用 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!

【问题讨论】:

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


    【解决方案1】:

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

    您想要的是跨流批次的持久性。

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

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

    【讨论】:

    • 谢谢。我试图使用 sparkSql 进行数据处理,因为对于初学者来说它看起来很容易。这就是为什么我考虑使用 Dataframe 缓存来保存流批处理数据。我认为我们可以通过在 foreach rdd 函数中缓存 df 来做到这一点,这样它就会缓存每个以前的流
    • 如果能这样工作就好了。 Apache Flink 可能值得研究,虽然我自己没有使用过。
    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 2021-12-14
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多