如何使用toDF创建带空值的DataFrame?

时间:2017-06-23 15:35:33

标签: scala apache-spark apache-spark-sql

如何使用.toDF创建包含序列空值的数据帧?

这有效:

val df = Seq((1,"a"),(2,"b")).toDF("number","letter")

但是我想做一些事情:

val df = Seq((1, NULL),(2,"b")).toDF("number","letter")

2 个答案:

答案 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,因为后者是基本类型无法容纳空值。