我正在使用spark-sql-2.4.1v在PoC中进行流式传输。
我有一个场景,我需要从hdfs / cassandra表中加载先前的数据,并比较流内容,即加入非流数据帧和流数据帧。
如果找到内容,我需要更新hdfs / cassandra表中的数据,否则在表/ hdfs中添加新行。
下一次相同的流式传输(以上添加)内容出现时,我需要再次更新记录...
所以我的问题是,当我最初从hdfs / cassandra表中加载数据帧时,其中不会包含最近添加的数据。
因此如何在每次处理新一批流时从hdfs / cassandra表刷新加载的数据帧?总体上,如何处理这种情况?
谢谢。
答案 0 :(得分:0)
免责声明:我只能说说Cassandra,而不是说HDFS。
基本上,在Cassandra中,插入和更新之间没有区别-即使具有相应主键的记录不存在,您也可以发出UPDATE
命令,或者您可以为该行执行INSERT
已经存在-在两种情况下,数据都将设置为给定值。
关于刷新来自Cassandra的数据-在这种情况下,Spark Cassandra Connector提供2 functions:joinWithCassandra
和leftJoinWithCassandra
-它们都只能在RDD上使用。第一个函数采用RDD并返回一个新的Pair RDD,它由左侧的原始数据和右侧的Cassandra数据组成-如果没有行对应原始数据,则不会将其包含在结果中。第二个函数是相似的,但是即使Cassandra中没有行,RDD中也会保留原始数据-在这种情况下,右侧将为空。这两个函数通常用于执行有效的数据查找,例如,使用附加信息来丰富来自流的数据。
在DSE Analytics中,还支持针对Cassandra的DataFrame联接,即所谓的“ DSE Direct Join”-它比Spark联接保存来自Cassandra的所有数据的数据帧有效得多,因为它将仅提取必要的数据从数据库记录,而不读取所有数据。