Pyspark从结构化流中的地图数组中提取值

问题描述 投票:0回答:1

我具有以下架构:

root
 |-- sents: array (nullable = false)
 |    |-- element: integer (containsNull = true)
 |-- metadata: array (nullable = true)
 |    |-- element: map (containsNull = true)
 |    |    |-- key: string
 |    |    |-- value: string (valueContainsNull = true)

在表中看起来像这样:

+----------+---------------------------------------------------------------------+
|sents     |metadata                                                             |
+----------+---------------------------------------------------------------------+
|[1, -1, 0]|[[confidence -> 0.4991], [confidence -> 0.5378], [confidence -> 0.0]]|
+----------+---------------------------------------------------------------------+

如何从数组列中的此映射列表访问te值?

谢谢

python apache-spark pyspark nested spark-structured-streaming
1个回答
0
投票

这是在Spark中使用explodetransform高阶功能的两个选项。

选项1(爆炸+ pyspark访问器)

首先,我们将数组的explode元素放入新列中,然后我们使用键metadata访问该图以检索值:

from pyspark.sql.functions import col, explode, expr

df = spark.createDataFrame([
  [[{"confidence":0.4991}, {"confidence":0.5378}, {"confidence":0.0}]]
], ["metadata"])

df.select(explode(col("metadata")).alias("metadata")) \
  .select(col("metadata")["confidence"].alias("value"))

# +------+
# |value |
# +------+
# |0.4991|
# |0.5378|
# |0.0   |
# +------+

选项2(转换+爆炸)

这里我们使用transform将地图的值提取到一个新数组中,然后我们explode它:

df.select(explode(expr("transform(metadata, i -> i['confidence'])")).alias("value"))
© www.soinside.com 2019 - 2024. All rights reserved.