如何使用.toDF创建包含序列空值的数据帧?
这有效:
val df = Seq((1,"a"),(2,"b")).toDF("number","letter")
但是我想做一些事情:
val df = Seq((1, NULL),(2,"b")).toDF("number","letter")
答案 0 :(得分:2)
NULL
未定义在API
的任何地方,null
,因此您可以定义
val df2 = Seq((1, null), (2, "b")).toDF("number","letter")
你应该输出
+------+------+
|number|letter|
+------+------+
|1 |null |
|2 |b |
+------+------+
诀窍是对带有空值的列使用两个或多个值来定义Spark SQL应该使用的类型。
以下不起作用:
val df = Seq((1, null)).toDF("number","letter")
在这种情况下,Spark无法知道字母的类型。
答案 1 :(得分:1)
除了Ramesh的回答之外,值得注意的是,由于toDF
使用反射来推断模式,因此提供的序列具有正确的类型非常重要。如果scala的类型推断不够,则需要明确指定类型。
例如,如果您希望第二列为可以为空的整数,则以下两种方法都不起作用:
Seq((1, null))
已推断类型Seq[(Int, Null)]
Seq((1, null), (2, 2))
已推断出类型Seq[(Int, Any)]
在这种情况下,您需要明确指定第二列的类型。至少有两种方法可以做到这一点。您可以显式指定序列的通用类型
Seq[(Int, Integer)]((1, null)).toDF
或为行创建案例类:
case class MyRow(x: Int, y: Integer)
Seq(MyRow(1, null)).toDF
请注意,我使用Integer
而不是Int
,因为后者是基本类型无法容纳空值。