Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 使用spark cassandra连接器,使用spark扫描多个cassandra表格_Apache Spark_Cassandra_Spark Cassandra Connector - Fatal编程技术网

Apache spark 使用spark cassandra连接器,使用spark扫描多个cassandra表格

Apache spark 使用spark cassandra连接器,使用spark扫描多个cassandra表格,apache-spark,cassandra,spark-cassandra-connector,Apache Spark,Cassandra,Spark Cassandra Connector,我有一个问题是如何使用spark操作/迭代/扫描cassandra的多个表。我们的项目使用spark&spark cassandra连接器连接到cassandra来扫描多个表,尝试匹配不同表中的相关值,如果匹配,则执行额外的操作,例如插入表。用例如下所示: sc.cassandraTable(KEYSPACE, "table1").foreach( row => { val company_url = row.getString("company_url") sc

我有一个问题是如何使用spark操作/迭代/扫描cassandra的多个表。我们的项目使用spark&spark cassandra连接器连接到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很大,collect将消耗所有内存。而且,如果在用例中,多个表使用广播,它将耗尽内存

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

  • 除了spark,还有其他工具(如hadoop等)可以优雅地处理这个问题吗


  • 看起来您实际上正在尝试进行一系列内部联接。见

    方法

    这允许您使用一个RDD的元素对Cassandra表进行直接查询。根据您从Cassandra处读取的数据比例,这可能是您的最佳选择。如果分数太大,最好分别读取这两个表,然后使用RDD.join方法将行对齐


    如果所有其他操作都失败,您可以始终手动使用对象直接访问Java驱动程序,并从分布式上下文对其执行原始请求。

    我无法执行联接,因为在大多数情况下,我必须使用string.contains比较相关列,不仅仅是字符串相等运算符。这需要笛卡尔连接,除非你有像Solr.Thank这样的二级索引。如果我做一个笛卡尔连接,结果会是巨大的,它可能会耗尽内存吗?如何使用二级索引来完成这些工作?