簡體   English   中英

將 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 數據源不支持 map 數據類型。 有沒有辦法將“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 |
+------------------------------+-----+

您應該在內置 function 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   |
#+--------------------------------+----+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM