这种混乱可能是由于我的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。
答案 0 :(得分:2)
问题是,仅使用Row
访问x
(地图函数中的x(0)
)中的元素会导致Any
作为数据类型。相反,在使用Long
:
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
。有人要求随着时间的推移删除此转换,因为它实际上很少需要,但它仍然存在。