将spark数据框中MapType类型列的数据转换为字符串
Convert the data of a column of type MapType in a spark data frame to string
我有一个数据框,其中有一列类型为 MapType:
df = spark.createDataFrame(
spark._sc.parallelize(
[[{"x": 30.0, "pool": 20.0, "helium": 10.0}, -5],
[{"x": 40.0, "pool": 30.0, "helium": 20.0}, 5]]
),
[
"col1", "col2"
]
)
+------------------------------+-----+
|col1 |col2 |
+------------------------------+-----+
|[x -> 1.0, y -> 2.0, z -> 3.0]| 5.0 |
|[x -> 4.0, y -> 5.0, z -> 6.0]| 5.0 |
+------------------------------+-----+
我在将其写入 CSV 文件时遇到问题。它抱怨 CSV 数据源不支持地图数据类型。有没有办法将 "col1" 数据转换为字符串数据类型,以便我可以继续写入 CSV 文件?我需要将数据框转换成这样:
+------------------------------+-----+
|col1 |col2 |
+------------------------------+-----+
|"x: 1.0, y: 2.0, z: 3.0" | 5.0 |
|"x: 4.0, y: 5.0, z: 6.0" | 5.0 |
+------------------------------+-----+
您应该在内置函数 to_json
中使用 spark 将您的 MapType
转换为 string
:
from pyspark.sql import functions as F
df.withColumn("col1", F.to_json("col1")).show(truncate=False)
#+------------------------------------+----+
#|col1 |col2|
#+------------------------------------+----+
#|{"pool":20.0,"x":30.0,"helium":10.0}|-5 |
#|{"pool":30.0,"x":40.0,"helium":20.0}|5 |
#+------------------------------------+----+
你也可以使用 regexp_replace
:
df.withColumn("col1",F.regexp_replace(F.to_json("col1"),'"','')).show(truncate=False)
#+------------------------------+----+
#|col1 |col2|
#+------------------------------+----+
#|{pool:20.0,x:30.0,helium:10.0}|-5 |
#|{pool:30.0,x:40.0,helium:20.0}|5 |
#+------------------------------+----+
您还可以 concat
使用它来获得您想要的输出:
df.withColumn("col1", F.concat(F.lit('"'),\
F.regexp_replace(F.to_json("col1"),'"','')\
,F.lit('"')))\
.show(truncate=False)
#+--------------------------------+----+
#|col1 |col2|
#+--------------------------------+----+
#|"{pool:20.0,x:30.0,helium:10.0}"|-5 |
#|"{pool:30.0,x:40.0,helium:20.0}"|5 |
#+--------------------------------+----+
我有一个数据框,其中有一列类型为 MapType:
df = spark.createDataFrame(
spark._sc.parallelize(
[[{"x": 30.0, "pool": 20.0, "helium": 10.0}, -5],
[{"x": 40.0, "pool": 30.0, "helium": 20.0}, 5]]
),
[
"col1", "col2"
]
)
+------------------------------+-----+
|col1 |col2 |
+------------------------------+-----+
|[x -> 1.0, y -> 2.0, z -> 3.0]| 5.0 |
|[x -> 4.0, y -> 5.0, z -> 6.0]| 5.0 |
+------------------------------+-----+
我在将其写入 CSV 文件时遇到问题。它抱怨 CSV 数据源不支持地图数据类型。有没有办法将 "col1" 数据转换为字符串数据类型,以便我可以继续写入 CSV 文件?我需要将数据框转换成这样:
+------------------------------+-----+
|col1 |col2 |
+------------------------------+-----+
|"x: 1.0, y: 2.0, z: 3.0" | 5.0 |
|"x: 4.0, y: 5.0, z: 6.0" | 5.0 |
+------------------------------+-----+
您应该在内置函数 to_json
中使用 spark 将您的 MapType
转换为 string
:
from pyspark.sql import functions as F
df.withColumn("col1", F.to_json("col1")).show(truncate=False)
#+------------------------------------+----+
#|col1 |col2|
#+------------------------------------+----+
#|{"pool":20.0,"x":30.0,"helium":10.0}|-5 |
#|{"pool":30.0,"x":40.0,"helium":20.0}|5 |
#+------------------------------------+----+
你也可以使用 regexp_replace
:
df.withColumn("col1",F.regexp_replace(F.to_json("col1"),'"','')).show(truncate=False)
#+------------------------------+----+
#|col1 |col2|
#+------------------------------+----+
#|{pool:20.0,x:30.0,helium:10.0}|-5 |
#|{pool:30.0,x:40.0,helium:20.0}|5 |
#+------------------------------+----+
您还可以 concat
使用它来获得您想要的输出:
df.withColumn("col1", F.concat(F.lit('"'),\
F.regexp_replace(F.to_json("col1"),'"','')\
,F.lit('"')))\
.show(truncate=False)
#+--------------------------------+----+
#|col1 |col2|
#+--------------------------------+----+
#|"{pool:20.0,x:30.0,helium:10.0}"|-5 |
#|"{pool:30.0,x:40.0,helium:20.0}"|5 |
#+--------------------------------+----+