pyspark从结构化流中的Map数组中提取值

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

我有以下模式:

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]]|
+----------+---------------------------------------------------------------------+

如何从数组列中的Map列表中访问te值?
谢谢您

dldeef67

dldeef671#

这里有两个选项使用spark中的分解和变换高阶函数。
选项1(explode+pyspark访问器)
首先我们 explode 数组的元素放入一个新列中,接下来我们使用键访问Map 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 将Map的值提取到一个新数组中,然后 explode 信息技术:

df.select(explode(expr("transform(metadata, i -> i['confidence'])")).alias("value"))

相关问题