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 executor查询cassandra_Apache Spark_Cassandra_Spark Streaming_Spark Cassandra Connector - Fatal编程技术网

Apache spark 从spark executor查询cassandra

Apache spark 从spark executor查询cassandra,apache-spark,cassandra,spark-streaming,spark-cassandra-connector,Apache Spark,Cassandra,Spark Streaming,Spark Cassandra Connector,我有一个来自卡夫卡的流媒体应用程序,我想知道是否有一种方法可以从地图函数内部进行范围查询 我按时间范围和键对来自卡夫卡的消息进行分组,然后根据这些时间范围和键,我希望将卡桑德拉的数据拉入该数据流 比如: lookups .map(lookup => ((lookup.key, lookup.startTime, lookup.endTime), lookup)) .groupByKey() .transform(rdd => { val cassandraSQLC

我有一个来自卡夫卡的流媒体应用程序,我想知道是否有一种方法可以从地图函数内部进行范围查询

我按时间范围和键对来自卡夫卡的消息进行分组,然后根据这些时间范围和键,我希望将卡桑德拉的数据拉入该数据流

比如:

lookups
  .map(lookup => ((lookup.key, lookup.startTime, lookup.endTime), lookup))
  .groupByKey()
  .transform(rdd => {
    val cassandraSQLContext = new CassandraSQLContext(rdd.context)
    rdd.map(lookupPair => {
      val tableName = //variable based on lookup
      val startTime = aggLookupPair._1._2
      val endTime = aggLookupPair._1._3

      cassandraSQLContext
        .cassandraSql(s"SELECT * FROM ${CASSANDRA_KEYSPACE}.${tableName} WHERE key=${...} AND start_time >= ${startTime} AND start_time < ${endTime};")
        .map(row => {
           //match to {
            case /*case 1*/ => new object1(row)
            case /*case 2*/ =>new object2(row)
          }
        })
        .collect()
    })
  })
我还尝试了
ssc.cassandraTable(CASSANDRA_KEYSPACE,tableName).where(“key=?”,…)…
,但spark在尝试访问地图内部的StreamingContext时崩溃


如果有人有任何建议,我将不胜感激。谢谢

如果查询基于分区键,则可能需要使用
joinWithCassandraTable

但是如果你需要更多的灵活性

CassandraConnector(sc.getConf).withSessionDo( session => ...)

将允许您访问executor上的会话池,并在不管理连接的情况下执行所需的任何操作。代码都是可序列化的,可以放在映射中

我不认为
SparkConf
是可序列化的,这会导致序列化问题。我还试图避免joinWithCassandraTable,因为我不能用它进行范围查询。你可以用joinWithCassandraTable进行范围查询,它接受CassandraTableRDD接受的所有子句。CassandraConnector是可序列化的val cc=CassandraConnector(sc.getConf),然后在您喜欢的任何地方使用cc
CassandraConnector(sc.getConf).withSessionDo( session => ...)