使用spark来使用spark-cassandra-connector扫描多个cassandra表

时间:2017-05-24 03:09:16

标签: apache-spark cassandra spark-cassandra-connector

我有一个如何使用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))
         }
     )
})

问题是

  1. 由于spark RDD不可序列化,嵌套搜索将失败,因为sc.cassandraTable返回RDD。我知道解决的唯一方法是使用sc.broadcast(sometable.collect())。但是如果sometable是巨大的,收集将消耗所有的内存。而且,如果在用例中,有几个表使用广播,它将耗尽内存。

  2. RDD.persist可以处理案例而不是广播吗?在我的例子中,我使用sc.cassandraTable读取RDD中的所有表并持久化回磁盘,然后检索数据以进行处理。如果有效,我如何保证rdd读取是由块完成的?

  3. 除了火花,还有其他工具(比如hadoop等等吗?)可以优雅地处理这个案子吗?

1 个答案:

答案 0 :(得分:0)

看起来你实际上是在尝试做一系列内连接。见

joinWithCassandraTable方法

这允许您使用One RDD的元素在Cassandra表上进行直接查询。根据您从Cassandra中读取的数据部分,这可能是您最好的选择。如果分数太大,你最好分别读取两个表,然后使用RDD.join方法排列行。

如果所有其他方法都失败了,您可以随时手动使用CassandraConnector对象直接访问Java驱动程序,并使用分布式上下文中的原始请求执行原始请求。