簡體   English   中英

CassandraRow 的 RDD 不能使用 take-command - 為什么?

[英]RDD of CassandraRow not working with take-command - why?

我正在做一些 DataStax VM 的練習。

給出了一個 CassandraTable,我將使用 Spark API 函數而不是 cassandra-query-functions 進行一些過濾和檢索前 5 個元素。

在那里我正在做以下事情:

val cassRdd = sc.cassandraTable("killr_video", "videos_by_year_title")
val cassRdd2 = cassRdd.filter(r=>r.getString("title") >= "T")
println("1" : + cassRdd2)
println("2" : + cassRdd2.count)
println("3" : + cassRdd2.take(5))
println("4" : + cassRdd2.take(5).count)

結果是:

  • 1: MapPartitionsRDD[185] at filter at :19
  • 2:2250
  • 3:[Lcom.datastax.spark.connector.CassandraRow;@56fd2e09
  • 4:編譯錯誤(TraversableOnce trait 中缺少方法計數的參數

我所期望的:

  • 1:和 2:按預期工作
  • 3:只返回一行? 我希望 RDD 為 5 cassandra Rows
  • 4:這不是 3: 之后的 rdd 計數,因此我沒想到它會起作用,看起來像是我不打算調用的某種 cassandraRow-count-method

Datastax 給出的解決方案使用 RDD 並對其進行映射轉換,僅獲取標題,並在該新標題 rdd 上進行過濾和獲取命令。

好的,有效,但我不明白,為什么 take 在 CassandraRow 的 RDD 上不起作用或結果可能是什么。

val cassRdd2 = cassRdd.map(r=>r.getString("title")).filter(t >= "T")

我認為任何 RDD(無論其內容如何)上的 take-command 總是相同的,取前 x 個元素產生一個完全相同類型的新 RDD,其大小為 x 個元素。

rdd.take(n)實際上將n元素移動到驅動程序並將它們作為數組返回,請參閱ScalaDoc 如果你想打印它們:

println("3" : + cassRdd2.take(5).toList)

cassRdd2.take(5).foreach(println) 最后一行不起作用,因為該方法被稱為數組的length (或size ):

println("4" : + cassRdd2.take(5).length)

我混淆了一些東西:

take是一個動作,我不應該期待 RDD(但它是什么?一些二進制文件?它有名字嗎?某種集合?如果合適,也可能是一個單一的值,如 String 或 int)

在這一點上,我不應該像在 RDD 上那樣使用count ,而應該像在 java-collections 上那樣使用size 順便說一句, count也是一個動作,在動作之后使用動作聽起來像轉儲,但它是如此直觀。

暫無
暫無

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

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