Spark创建含Seq()与String两列DataFrame报错求助
解决Spark Shell中创建多列DataFrame的类型错误问题
这个问题我之前也碰到过,核心是你构建序列的方式不对,导致Scala的类型推断出了问题,进而触发value toDF is not a member of Seq[Object]的错误。
问题根源
你写的Seq(Seq(Array(1,2)),"jf")里包含了两种完全不兼容的元素:
- 第一个元素是
Seq(Array(1,2))(类型为Seq[Array[Int]]) - 第二个元素是字符串
"jf"(类型为String)
Scala会自动把这个序列的类型统一推断成Seq[Object],而Spark并没有为Seq[Object]提供生成DataFrame的隐式转换,所以就报错了。而且从逻辑上来说,你想创建两列的DataFrame,就需要确保序列里的每个元素都对应一行数据的两列值,而不是把两个不同类型的元素当成两行单列数据。
正确的写法
你需要把每行的两列值打包成一个整体(二元组或包含两个元素的序列),再放到外层序列里:
方式1:用二元组表示每行数据
val df1 = Seq( (Seq(Array(1,2)), "jf") ).toDF("a","b")
方式2:用嵌套Seq表示每行数据
val df1 = Seq( Seq(Array(1,2), "jf") ).toDF("a","b")
验证结果
执行df1.show(false)就能得到预期的两列DataFrame:
+----------+---+ |a |b | +----------+---+ |[[1, 2]] |jf | +----------+---+
内容的提问来源于stack exchange,提问作者Shibani
相关产品推荐
相关产品推荐

