如何刷新非流数据帧的内容?

时间:2019-09-06 04:14:45

标签: apache-spark cassandra apache-spark-sql spark-streaming datastax-enterprise

我正在使用spark-sql-2.4.1v在PoC中进行流式传输。

我有一个场景,我需要从hdfs / cassandra表中加载先前的数据,并比较流内容,即加入非流数据帧和流数据帧。

如果找到内容,我需要更新hdfs / cassandra表中的数据,否则在表/ hdfs中添加新行。

下一次相同的流式传输(以上添加)内容出现时,我需要再次更新记录...

所以我的问题是,当我最初从hdfs / cassandra表中加载数据帧时,其中不会包含最近添加的数据。

因此如何在每次处理新一批流时从hdfs / cassandra表刷新加载的数据帧?总体上,如何处理这种情况?

谢谢。

1 个答案:

答案 0 :(得分:0)

免责声明:我只能说说Cassandra,而不是说HDFS。

基本上,在Cassandra中,插入和更新之间没有区别-即使具有相应主键的记录不存在,您也可以发出UPDATE命令,或者您可以为该行执行INSERT已经存在-在两种情况下,数据都将设置为给定值。

关于刷新来自Cassandra的数据-在这种情况下,Spark Cassandra Connector提供2 functionsjoinWithCassandraleftJoinWithCassandra-它们都只能在RDD上使用。第一个函数采用RDD并返回一个新的Pair RDD,它由左侧的原始数据和右侧的Cassandra数据组成-如果没有行对应原始数据,则不会将其包含在结果中。第二个函数是相似的,但是即使Cassandra中没有行,RDD中也会保留原始数据-在这种情况下,右侧将为空。这两个函数通常用于执行有效的数据查找,例如,使用附加信息来丰富来自流的数据。

在DSE Analytics中,还支持针对Cassandra的DataFrame联接,即所谓的“ DSE Direct Join”-它比Spark联接保存来自Cassandra的所有数据的数据帧有效得多,因为它将仅提取必要的数据从数据库记录,而不读取所有数据。