在Spark读取JSON时,将单个值转换为数组



json可以将单个值或多个值的数组作为属性值。例如,"A":"ae""A":["ab", "cd"]当我读取JSON-ND文件(每行都是JSON(时,我的目标属性可能具有相同类型值的单个值或数组。

我需要使用explode()获取数据。但是当显示一个值时,explode()抱怨。

那么,我的问题是如何使某个属性的所有值成为Spark DataFrame中的数组?

如果所有值都是标量,则可以使用array函数:

import org.apache.spark.sql.functions._
array(col("A")).alias("A")
spark.read.json(
  Seq("""{"A": "ae"}""").toDS).select(array(col("A")).alias("A")
).show
// +----+
// |   A|
// +----+
// |[ae]|
// +----+

如果值混合在一起,则可以手动进行解析:

import org.apache.spark.sql.types._
Seq("""{"A": "ae"}""", """{"A": ["ab", "cd"]}""").toDS.select(coalesce(
    // Attempt to parse value as array<string>
    from_json($"value", StructType.fromDDL("A array<string>"))("A"),
    // If the first one fails, try to extract it as string and enclose with array
    array(get_json_object($"value", "$.A"))
).alias("A")).show
// +--------+
// |       A|
// +--------+
// |    [ae]|
// |[ab, cd]|
// +--------+

如果您使用较旧的火花版本替换:

 StructType.fromDDL("A array<string>")

StructType(Seq(StructField("A", ArrayType(StringType))))

最新更新