Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将spark数据帧中MapType类型的列的数据转换为字符串_Python_Pyspark_Pyspark Dataframes - Fatal编程技术网

Python 将spark数据帧中MapType类型的列的数据转换为字符串

Python 将spark数据帧中MapType类型的列的数据转换为字符串,python,pyspark,pyspark-dataframes,Python,Pyspark,Pyspark Dataframes,我有一个数据框,它有一个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" ] ) 我在将其写入CSV

我有一个数据框,它有一个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"
    ]
)
我在将其写入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 |
+------------------------------+-----+

您应该使用spark内置函数
到_json
映射类型
转换为
字符串

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替换它:

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