我有一个如何使用spark来操作/迭代/扫描多个cassandra表的问题。我们的项目使用spark& spark-cassandra-connector连接到cassandra来扫描多个表,尝试匹配不同表中的相关值,如果匹配,则采取额外的操作,如表插入。用例如下:
sc.cassandraTable(KEYSPACE, "table1").foreach(
row => {
val company_url = row.getString("company_url")
sc.cassandraTable(keyspace, "table2").foreach(
val url = row.getString("url")
val value = row.getString("value")
if (company_url == url) {
sc.saveToCassandra(KEYSPACE, "target", SomeColumns(url, value))
}
)
})
问题是
由于spark RDD不可序列化,嵌套搜索将失败,因为sc.cassandraTable返回RDD。我知道解决的唯一方法是使用sc.broadcast(sometable.collect())。但是如果sometable是巨大的,收集将消耗所有的内存。而且,如果在用例中,有几个表使用广播,它将耗尽内存。
RDD.persist可以处理案例而不是广播吗?在我的例子中,我使用sc.cassandraTable读取RDD中的所有表并持久化回磁盘,然后检索数据以进行处理。如果有效,我如何保证rdd读取是由块完成的?
除了火花,还有其他工具(比如hadoop等等吗?)可以优雅地处理这个案子吗?
答案 0 :(得分:0)
看起来你实际上是在尝试做一系列内连接。见
这允许您使用One RDD的元素在Cassandra表上进行直接查询。根据您从Cassandra中读取的数据部分,这可能是您最好的选择。如果分数太大,你最好分别读取两个表,然后使用RDD.join方法排列行。
如果所有其他方法都失败了,您可以随时手动使用CassandraConnector
对象直接访问Java驱动程序,并使用分布式上下文中的原始请求执行原始请求。