从复杂的映射类型数组中提取值到字符串

Extract value from complex array of map type to string

我有一个如下所示的数据框。

No    comp_value
1     [[ -> 10]]
2     [[ -> 35]]

列的架构类型 - 值为。

comp_value: array (nullable = true)
      element: map(containsNull = true)
              key: string
              value: long (valueContainsNull = true)

我想使用 PySpark 将 comp_value 从复杂类型转换为字符串。有办法实现吗?

预期输出:

No    comp_value
1     10
2     35

我假设您的数据如下所示:

from pyspark.sql import functions as F

df = spark.createDataFrame(
    [(1, 10),
     (2, 35)],
    ['No', 'v'])
df = df.select('No', F.array(F.create_map(F.lit(''), 'v')).alias('comp_value'))

df.show()
# +---+----------+
# |No |comp_value|
# +---+----------+
# |1  |[{ -> 10}]|
# |2  |[{ -> 35}]|
# +---+----------+

您可以通过使用索引号引用它们来提取数组中的值(在本例中为 [0])。从地图中提取值是通过引用键来完成的(在本例中 [''])。

df2 = df.select('No', F.col('comp_value')[0][''].cast('string').alias('comp_value'))

df2.show()
# +---+----------+
# |No |comp_value|
# +---+----------+
# |  1|        10|
# |  2|        35|
# +---+----------+
from pyspark.sql import functions as F

df = spark.createDataFrame(
    [(1,' [[ -> 10]]'),
     (2, '[[ -> 35]]')],
    ['No', 'v'])


df.show()

替换角括号,去掉尾部的space,按space拆分得到一个列表,通过切片得到你想要的元素

new = df.withColumn('comp_value', split(trim(regexp_replace('v','\[|\]','')),'\s')[1])

new.show()

+---+-----------+----------+
| No|          v|comp_value|
+---+-----------+----------+
|  1| [[ -> 10]]|        10|
|  2| [[ -> 35]]|        35|
+---+-----------+----------+