[英]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 并对其进行映射转换,仅获取标题,并在该新标题 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.