簡體   English   中英

Cassandra Spark連接器和數據過濾

[英]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。 除此之外,您還可以做很多事情來修剪數據服務器端。

https://github.com/datastax/spark-cassandra-connector/blob/master/doc/3_selection.md#filtering-rows---其中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM