RDD中的数据类型似乎是java.lang.Long,但map函数给出了类型不匹配错误

时间:2017-10-25 21:51:34

标签: scala apache-spark

这种混乱可能是由于我的Scala无知。

&

显然类型是Longs。不幸的是,当我尝试映射函数时,map()似乎需要一个String:

scala> spark.range(2).toDF("number").rdd.map(x => x(0).getClass).collect
res155: Array[Class[_]] = Array(class java.lang.Long, class java.lang.Long)

发生了什么事?一位同事向我指出了我们所拥有的Spark文档,

  

...在Spark 2.0中,DataFrames只是Scala和Java API中Rows的数据集。与“类型转换”相比,这些操作也称为“无类型转换”,带有强类型Scala / Java数据集。

然而,这似乎与问题无关,因为getClass()的结果似乎是java.lang.Long。

2 个答案:

答案 0 :(得分:2)

问题是,仅使用Row访问x(地图函数中的x(0))中的元素会导致Any作为数据类型。相反,在使用Long

访问值时,告诉Spark它是getAs
spark.range(2).toDF("number").rdd.map(x => x.getAs[Long](0)).collect

您可以使用列名而不是索引来使其更清晰:

spark.range(2).toDF("number").rdd.map(x => x.getAs[Long]("number")).collect

更好的方法是将数据帧转换为数据集而不是rdd:

spark.range(2).toDF("number").as[Long].collect

答案 1 :(得分:0)

  

map()似乎想要一个String:

map不想要String+。正如拉梅什的回答所说,x(0)的类型为Any。虽然您无法向Any添加号码,但您can会添加String。有人要求随着时间的推移删除此转换,因为它实际上很少需要,但它仍然存在。