我正在对DataStax VM进行一些练习。 给出了一个CassandraTable,我将使用Spark API函数而不是cassandra-querie-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并对其进行映射转换,以仅获取标题,并在该新title-rdd上进行过滤和获取命令。
好的,可以,但是我不明白,为什么在CassandraRow的RDD上使用take无效,或者结果可能是什么。
val cassRdd2 = cassRdd.map(r=>r.getString("title")).filter(t >= "T")
我认为任何RDD(无论其内容如何)上的take命令都将始终保持相同,将第一个x元素带入一个新的完全相同类型的RDD,其大小为x元素。
答案 0 :(得分:2)
rdd.take(n)
实际上将n
个元素移到驱动程序并将它们作为数组返回,请参见ScalaDoc。如果要打印它们:
println("3" : + cassRdd2.take(5).toList)
或cassRdd2.take(5).foreach(println)
。最后一行不起作用,因为该方法对于数组称为length
(或size
):
println("4" : + cassRdd2.take(5).length)
答案 1 :(得分:0)
我混合了一些东西
take
是一个动作,我不应该指望RDD(但是它是什么?一些二进制文件?它有名称吗?某种集合?也可能是单个值,例如String或int,如果有的话)适合)
关于这一点,我不应该像在RDD上那样使用count
,而应该像在Java集合上那样使用size
。顺便说一句,count
也是一个动作,在听起来像转储的动作之后使用一个动作,但是它是如此直观。