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)

结果:

我的预期:

Datastax 给出的解决方案使用 RDD 并对其执行 map-transformation,仅获取标题,并在新的 title-rdd 上执行过滤和 take-command。

好的,可以,但我不明白,为什么 take 在 RDD-of CassandraRow 上不起作用或者结果可能是什么。

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

我认为任何 RDD 上的 take-command(不管它的内容如何)总是做同样的事情,取前 x 个元素产生一个完全相同类型的新 RDD,大小为 x 个元素。

rdd.take(n) 实际上将 n 元素移动到驱动程序并将它们 returns 作为数组移动,请参阅 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也是一个动作,在一个动作之后使用一个动作听起来像转储,但它是如此直观。