Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何使用toDF创建具有空值的数据帧?_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 如何使用toDF创建具有空值的数据帧?

Scala 如何使用toDF创建具有空值的数据帧?,scala,apache-spark,apache-spark-sql,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") NULL未在APIs中的任何位置定义,但NULL是,因此您可以定义如下内容 val df2 = Seq((1, null), (2, "b")).toDF("number","letter

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

这项工作:

val df = Seq((1,"a"),(2,"b")).toDF("number","letter")
但我想做一些大致如下的事情:

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

NULL
未在
API
s中的任何位置定义,但
NULL
是,因此您可以定义如下内容

val df2 = Seq((1, null), (2, "b")).toDF("number","letter")
您应该将输出设置为

+------+------+
|number|letter|
+------+------+
|1     |null  |
|2     |b     |
+------+------+
诀窍是对带有null的列使用两个或多个值来定义Spark SQL应该使用的类型

那么,以下操作将不起作用:

val df = Seq((1, null)).toDF("number","letter")

Spark无法知道这种情况下的字母类型。

除了Ramesh的答案之外,值得注意的是,由于
toDF
使用反射来推断模式,因此提供的序列必须具有正确的类型。如果scala的类型推断还不够,则需要显式指定类型

例如,如果希望第2列为可为null的整数,则以下两种方法均无效:

Seq((1,null))
具有推断类型
Seq[(Int,null)]
Seq((1,null)、(2,2))
具有推断类型
Seq[(Int,Any)]

在这种情况下,需要显式指定第二列的类型。至少有两种方法可以做到这一点。可以显式指定序列的泛型类型

Seq[(Int, Integer)]((1, null)).toDF
或者为行创建一个case类:

case class MyRow(x: Int, y: Integer)
Seq(MyRow(1, null)).toDF

请注意,我使用了
Integer
而不是
Int
,因为后者是一种基本类型,不能容纳空值。

后续(可能会作为另一个问题发布,但最好合并到这里):为什么val df=Seq((1,null),(2,“1”)。toDF(“field1”,“field2”)可以工作,但是val df=Seq((1,null),(2,1))。toDF(“field1”),“field2”)不起作用?@user2682459,这是因为数据帧需要为每列提供常量数据类型的架构。null为stringType,1为integerType。它们与field2数据类型不匹配。好的,那么如何生成具有null/缺少数值的数据帧?我猜不能使用null。如果定义为
val df=Seq((1,null.asInstanceOf[Int]),(2,1)).toDF(“field1”,“field2”)
null值被转换为0。因此,要么将field2定义为stringType,要么将null替换为0。实际上,它可以用于数字以及Spark中的任何其他类型。最简单的方法是使用case类。例如
case类MyRow(x:Integer,y:Integer)
。然后
Seq(MyRow(null,null))。toDF
将生成您所期望的可为null的整数。