从复杂的映射类型数组中提取值到字符串
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|
+---+-----------+----------+
我有一个如下所示的数据框。
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|
+---+-----------+----------+