具有空值的Seq [(Int,Int)]隐式转换为DataFrame

时间:2018-10-24 01:40:22

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

我有一个简单的测试用例,可以将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")

这是怎么了?

2 个答案:

答案 0 :(得分:1)

您不能像这样直接使用null,因为创建的列将是Any类型(数据帧不允许)。可以通过创建RDD来确认:

val rdd: RDD[(Any, Any)] = spark.sparkContext.parallelize(Seq((null, 1), (2, null), (null, 3)))

这是由于Scala tour中的Int在Scala中不可为空:

  

有九种预定义的值类型,它们是不可为空的:DoubleFloatLongIntShort,{{1} },ByteCharUnit

可以直接使用Boolean创建具有其他数据类型(例如字符串)的列,否则一个简单的解决方案是使用nullNone

Some

答案 1 :(得分:1)

如果要使用$("#multiChkBioMasures").multiselect(); ,应将nulls替换为Ints

java.lang.Integers

可以为空的