RDD of CassandraRow无法使用take方法?原因探究
关于Spark CassandraRow RDD的take输出与count方法问题
我来帮你拆解一下你遇到的两个核心问题:
问题1:take(5)输出[Lcom.datastax.spark.connector.CassandraRow;@56fd2e09而非实际数据
你看到的这个输出并不是Spark的take方法表现异常,而是Scala数组的默认toString行为导致的。当你调用cassRdd2.take(5)时,确实返回了包含5个CassandraRow对象的Array[CassandraRow],但直接打印数组的话,Scala会输出数组的类型标识+内存地址(也就是你看到的哈希格式),而不会自动遍历打印每个元素的内容。
想要看到实际的Row数据,你可以做以下几种处理:
- 把数组转换成Scala集合(比如List),集合的toString会展示元素内容:
println("3: " + cassRdd2.take(5).toList) - 用
mkString自定义输出格式:println("3: " + cassRdd2.take(5).mkString("[", ", ", "]")) - 遍历数组逐个打印每个
CassandraRow:cassRdd2.take(5).foreach(row => println(row))
问题2:take(5).count编译错误
这里的问题是你混淆了RDD的count方法和Scala数组的count方法:
- RDD的
count()是无参方法,用来统计RDD的总元素数; - 而
take(5)返回的是Array[CassandraRow],数组的count方法是来自TraversableOncetrait的带参方法,它需要一个谓词函数(比如用来过滤符合条件的元素数量),所以你直接调用无参的count就会报错。
如果你想统计take返回的数组长度,应该用length属性:
println("4: " + cassRdd2.take(5).length)
关于DataStax解决方案的说明
DataStax的方案是把CassandraRow映射成String类型,但本质上并不是因为take对CassandraRow类型RDD有特殊限制——不管RDD元素是什么类型,take都会返回对应类型的数组,只是直接打印数组都会出现类似的哈希输出。他们的方案只是将元素转换成了更易读的String类型,后续如果直接打印数组,虽然还是会显示数组的格式,但元素本身是String,转换成集合后可读性更强。
总结一下:你的原始代码逻辑是对的,take确实获取到了前5条CassandraRow数据,只是打印方式不对导致看不到内容;而count的错误是因为调用了数组的带参count方法,而非无参的统计长度的方法。
内容的提问来源于stack exchange,提问作者Kaspatoo
相关产品推荐
相关产品推荐

