我有一个简单的测试用例,可以将Seq[(Int,Int)]
转换为DataFrame:
test("SparkTest 0280") {
val conf = new SparkConf().set("spark.sql.codegen.wholeStage", "false").set("spark.sql.cbo.enabled", "true")
val spark = SparkSession.builder().config(conf).master("local").appName("SparkTest").enableHiveSupport().getOrCreate()
import spark.implicits._
Seq[(Int,Int)]((null, 1), (2, null), (null, 3)).toDF("a", "b").createOrReplaceTempView("t")
spark.sql("select a,b,nvl(a,b) from t").show(truncate = false)
}
存在编译问题:
Error:(565, 21) an expression of type Null is ineligible for implicit conversion
Seq[(Int,Int)]((null, 1), (2, null), (null, 3)).toDF("a", "b").createOrReplaceTempView("t")
这是怎么了?
答案 0 :(得分:1)
您不能像这样直接使用null
,因为创建的列将是Any
类型(数据帧不允许)。可以通过创建RDD来确认:
val rdd: RDD[(Any, Any)] = spark.sparkContext.parallelize(Seq((null, 1), (2, null), (null, 3)))
这是由于Scala tour中的Int
在Scala中不可为空:
有九种预定义的值类型,它们是不可为空的:
Double
,Float
,Long
,Int
,Short
,{{1} },Byte
,Char
和Unit
。
可以直接使用Boolean
创建具有其他数据类型(例如字符串)的列,否则一个简单的解决方案是使用null
和None
:
Some
答案 1 :(得分:1)
如果要使用$("#multiChkBioMasures").multiselect();
,应将nulls
替换为Ints
:
java.lang.Integers
可以为空的