[英]Cassandra Spark Connector and filtering data
我正在使用Spark 1.3.1,並且編寫了一個小程序來過濾cassandra上的數據
val sc = new SparkContext(conf)
val rdd = sc.cassandraTable("foo", "bar")
val date = DateTime.now().minusHours(1)
val rdd2 = rdd.filter(r => r.getDate("date").after(date.toDate))
println(rdd2.count())
sc.stop()
該程序運行了很長時間,打印出如下消息
16/09/01 21:10:31 INFO Executor: Running task 46.0 in stage 0.0 (TID 46)
16/09/01 21:10:31 INFO TaskSetManager: Finished task 42.0 in stage 0.0 (TID 42) in 20790 ms on localhost (43/1350)
如果我終止程序並將代碼更改為
val date = DateTime.now().minusHours(1)
val rdd2 = rdd.filter(r => r.getDate("date").after(date.toDate))
它仍然運行很長時間,並顯示如下消息
6/09/01 21:14:01 INFO Executor: Running task 8.0 in stage 0.0 (TID 8)
16/09/01 21:14:01 INFO TaskSetManager: Finished task 4.0 in stage 0.0 (TID 4) in 19395 ms on localhost (5/1350)
因此,似乎該程序將始終嘗試將整個cassandra表加載到內存中(或嘗試對其進行完全掃描),然后才應用過濾器。 對我來說這似乎效率極低。
我如何以更好的方式編寫此代碼,以使spark不會嘗試將整個cassandra表加載(或完全掃描)到RDD中,然后才應用過濾器?
您的第一段代碼
val rdd = sc.cassandraTable("foo", "bar")
val date = DateTime.now().minusDays(30)
rdd.filter(r => r.getDate("date").after(date.toDate)).count // Count Filtered RDD
所以要小心 RDD是不可變的,因此當您應用過濾器時,您需要使用返回的RDD,而不是應用了該函數的RDD。
val rdd = sc.cassandraTable("foo", "bar")
val date = DateTime.now().minusDays(30)
rdd.filter(r => r.getDate("date").after(date.toDate)) // Filters RDD
println(rdd.cassandraCount()) // Ignores filtered rdd and counts everything
為了更有效地閱讀Cassandra:
如果日期列是聚類鍵,則可以使用.where
函數將謂詞下推到Cassandra。 除此之外,您還可以做很多事情來修剪數據服務器端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.