CassandraRow的RDD无法与接受命令配合使用-为什么?

时间:2019-05-09 10:43:02

标签: scala apache-spark spark-cassandra-connector

我正在对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)

结果:

  • 1:过滤器位于:19处的MapPartitionsRDD [185]
  • 2:2250
  • 3:[Lcom.datastax.spark.connector.CassandraRow; @ 56fd2e09
  • 4:编译错误(缺少特征中方法计数的参数 TraversableOnce

我所期望的:

  • 1:和2:按预期工作
  • 3:仅返回一行?我希望Rs为5 cassandra Rows
  • 4:这不是3以后的rdd计数,因此我没想到它会起作用, 看起来像是某种cassandraRow-count-method我不是 打算打电话给

Datastax提供的解决方案使用RDD并对其进行映射转换,以仅获取标题,并在该新title-rdd上进行过滤和获取命令。

好的,可以,但是我不明白,为什么在CassandraRow的RDD上使用take无效,或者结果可能是什么。

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

我认为任何RDD(无论其内容如何)上的take命令都将始终保持相同,将第一个x元素带入一个新的完全相同类型的RDD,其大小为x元素。

2 个答案:

答案 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也是一个动作,在听起来像转储的动作之后使用一个动作,但是它是如此直观。