Spark Explode 空列返回空行

1 apache-spark apache-spark-sql

我是 Spark 编程新手。我正在尝试用空行爆炸 DataFrame 的列。我认为爆炸函数简单来说,为数组中的每个元素创建额外的行。但结果不同。

我无法理解分解的 DataFrame 背后的逻辑。有人可以解释一下下面的例子吗?我想了解这个结果的根本原理/原因。为什么空数组在数据框中被视为空?

//inputDataFrame
+---+------+----------+
|age|  name|occupation|
+---+------+----------+
| []|Harish| developer|
+---+------+----------+

df.withColumn("age",explode(col("age")))

//DataFrame with age column exploded
+---+----+----------+
|age|name|occupation|
+---+----+----------+
+---+----+----------+

// expected DataFrame
    +---+------+----------+     +----+------+----------+
    |age|  name|occupation|     |age |  name|occupation|
    +---+------+----------+ (or)+----+------+----------+
    |   |Harish| developer|     |null|Harish| developer|
    +---+------+----------+     +----+------+----------+
Run Code Online (Sandbox Code Playgroud)

EDIT1:根据 Chandan,我发现这个堆栈问题Spark sql how toexplode without Losing null Values并且可以理解可用于 Spark2 的爆炸 API。但我找不到关于为什么删除该行的正确解释。

Cha*_*Ray 6

这就是explode api 的行为。如果你想获得所需的输出,请使用explode_outer

df.withColumn("age",explode_outer(col("age")))
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题,爆炸函数与数据集的平面地图相同。explode_outer 生成相同的输出,但唯一的区别是,如果数组或映射为空,那么它不会忽略它,并且会为该列与其他列生成空值。请检查源代码https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/functions.scala (2认同)