gpt4 book ai didi

scala - 在 Spark 中创建给定模式的空数组列

转载 作者:行者123 更新时间:2023-12-02 05:52:26 25 4
gpt4 key购买 nike

由于parquet无法解析空数组,所以在写表之前我将空数组替换为null。现在,当我阅读表格时,我想做相反的事情:

我有一个具有以下架构的 DataFrame :

|-- id: long (nullable = false)
|-- arr: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- x: double (nullable = true)
| | |-- y: double (nullable = true)

以及以下内容:

+---+-----------+
| id| arr|
+---+-----------+
| 1|[[1.0,2.0]]|
| 2| null|
+---+-----------+

我想用空数组替换空数组(id=2),即

+---+-----------+
| id| arr|
+---+-----------+
| 1|[[1.0,2.0]]|
| 2| []|
+---+-----------+

我已经尝试过:

val arrSchema = df.schema(1).dataType

df
.withColumn("arr",when($"arr".isNull,array().cast(arrSchema)).otherwise($"arr"))
.show()

给出:

java.lang.ClassCastException: org.apache.spark.sql.types.NullType$ cannot be cast to org.apache.spark.sql.types.StructType

编辑:我不想“硬编码”数组列的任何模式(至少不是结构的模式),因为这可能因情况而异。我只能在运行时使用来自 df 的架构信息

顺便说一下,我使用的是 Spark 2.1,因此无法使用 typedLit

最佳答案

  • 具有已知外部类型的 Spark 2.2+

    一般来说,您可以使用typedLit来提供空数组。

    import org.apache.spark.sql.functions.typedLit

    typedLit(Seq.empty[(Double, Double)])

    要为嵌套对象使用特定名称,您可以使用案例类:

    case class Item(x: Double, y: Double)

    typedLit(Seq.empty[Item])

    rename by cast :

    typedLit(Seq.empty[(Double, Double)])
    .cast("array<struct<x: Double, y: Double>>")
  • 仅具有架构的 Spark 2.1+

    只有您可以尝试使用架构:

    val schema = StructType(Seq(
    StructField("arr", StructType(Seq(
    StructField("x", DoubleType),
    StructField("y", DoubleType)
    )))
    ))

    def arrayOfSchema(schema: StructType) =
    from_json(lit("""{"arr": []}"""), schema)("arr")

    arrayOfSchema(schema).alias("arr")

    其中schema可以从现有的DataFrame中提取并用附加的StructType包装:

    StructType(Seq(
    StructField("arr", df.schema("arr").dataType)
    ))

关于scala - 在 Spark 中创建给定模式的空数组列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51060312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com