pyspark只从结构数组中读取一个元素

wko9yo5t  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(510)

我有一个struct element数组类型的列。

|-- id
|-- paintUsed: array (nullable = true)
|    |-- element: struct (containsNull = true)
|    |    |-- paintCode: string (nullable = true)
|    |    |-- amountUsed: struct (nullable = true)
|    |    |    |-- amount: integer (nullable = true)
|    |    |    |-- unit: string (nullable = true)

下面是数据示例

id | PaintUsed
 ----------------------
 1  | [[Red,[ML, 100.0]],[Green[Litre, 4.0]]]
 2  | [[Blue,[ML, 400.0]],[Red[Litre, 2.0]]]

我知道我们可以将struct的每个元素分解成不同的行,但是我的数据量非常大,如果分解,行数将变成4-5倍,并导致性能问题。我想从上面的列表中取绿色值。这将只有一个记录,因此记录的数量不会增加。我可以爆炸和过滤,但在这里之前,过滤器应用的记录数量将太高。
不管怎样,只要一个struct数组中的一个元素就可以不分解。
任何帮助都将不胜感激

jdzmm42g

jdzmm42g1#

之前 explode ,使用高阶函数 filter 在列上 paintUsed ,只去哪里 paintUsed.paintCode='Green' .

df.withColumn("green", F.explode(F.expr("""filter(paintUsed, x-> x.paintCode == 'Green')""")))

相关问题