Seq [(Int, Int)] с нулями, неявно преобразованными в DataFrame - PullRequest
0 голосов
/ 24 октября 2018

У меня есть простой тестовый пример, который преобразует 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 голосов
/ 24 октября 2018

Если вы хотите использовать nulls, вы должны заменить Ints на java.lang.Integers:

Seq[(Integer, Integer)]((null, 1), (2, null), (null, 3)).toDF("a", "b")
// org.apache.spark.sql.DataFrame = [a: int, b: int]

, которые могут быть обнуляемыми.

0 голосов
/ 24 октября 2018

Вы не можете использовать null напрямую, как это, поскольку созданный столбец будет иметь тип Any (недопустимо для фреймов данных).Это может быть подтверждено созданием RDD:

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

Это связано с тем, что Int не допускает обнуление в Scala из Scala tour :

Существует девять предопределенных типов значений, и они не могут обнуляться: Double, Float, Long, Int, Short, Byte, Char, Unit и Boolean.

Столбцы с другими типами данных (например, строки) можно создавать напрямую с помощью null, в противном случае простым решением будет использование None и Some:

Seq((None, Some(1)), (Some(2), None), (None, Some(3))).toDF("a", "b"))
...