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 => ...)