我具有以下架构:
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值?
谢谢
这是在Spark中使用explode和transform高阶功能的两个选项。
选项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"))