[英]Query cassandra from spark executor
我有一個關於kafka的流媒體應用程序,我想知道是否有辦法在地圖功能中進行范圍查詢?
我按照時間范圍和密鑰對來自kafka的消息進行分組,然后根據我想要將數據從cassandra拉入該dstream的時間范圍和密鑰。
就像是:
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()
})
})
這給了我一個空指針異常:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 59.0 failed 1 times, most recent failure: Lost task 0.0 in stage 59.0 (TID 63, localhost): java.lang.NullPointerException
at org.apache.spark.sql.SQLContext.parseSql(SQLContext.scala:231)
at org.apache.spark.sql.cassandra.CassandraSQLContext.cassandraSql(CassandraSQLContext.scala:70)
at RollupFineGrainIngestionService$$anonfun$11$$anonfun$apply$2.apply(MyFile.scala:130)
at RollupFineGrainIngestionService$$anonfun$11$$anonfun$apply$2.apply(MyFile.scala:123)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:370)
at org.apache.spark.storage.MemoryStore.unrollSafely(MemoryStore.scala:285)
at org.apache.spark.CacheManager.putInBlockManager(CacheManager.scala:171)
at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:78)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:268)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:306)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:270)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:306)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:270)
我也嘗試過ssc.cassandraTable(CASSANDRA_KEYSPACE, tableName).where("key = ?", ...)...
但是在嘗試訪問地圖內的StreamingContext時火花會崩潰。
如果有人有任何建議,我將不勝感激。 謝謝!
如果查詢基於分區鍵,則可能需要使用joinWithCassandraTable
。
但如果你需要更多的靈活性
CassandraConnector(sc.getConf).withSessionDo( session => ...)
允許您訪問執行程序上的會話池並執行您想要的任何操作而無需管理連接。 代碼都是可序列化的,可以放在地圖中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.