首页 > 解决方案 > 从 CSV 读取字符串数组作为 Pyspark 中的数组

问题描述

我有一个csv包含这样数据的文件

ID|Arr_of_Str
 1|["ABC DEF"]
 2|["PQR", "ABC DEF"]

我想读取这个.csv文件,但是当我使用时sqlContext.read.load,它正在读取它作为字符串

当前的:

df.printSchema()

root
 |-- ID: integer (nullable = true)
 |-- Arr_of_Str: string (nullable = true)

预期的:

df.printSchema()

root
 |-- ID: integer (nullable = true)
 |-- Arr_of_Str: array (nullable = true)
      |-- element: string (containsNull = true)

如何将字符串转换为字符串数组?

标签: apache-sparkpysparkapache-spark-sql

解决方案


更新:

实际上,您可以简单地from_json将列解析Arr_of_Str为字符串数组:

from pyspark.sql import functions as F

df2 = df.withColumn(
    "Arr_of_Str",
    F.from_json(F.col("Arr_of_Str"), "array<string>")
)

df1.show(truncate=False)

#+---+--------------+
#|ID |Arr_of_Str    |
#+---+--------------+
#| 1 |[ABC DEF]     |
#| 2 |[PQR, ABC DEF]|
#+---+--------------+

老答案:

读取数据时不能这样做,因为 CSV 中不支持复杂的数据结构。加载 DataFrame 后,您必须进行转换。

只需从字符串中删除数组方括号并将其拆分以获得数组列。

from pyspark.sql.functions import split, regexp_replace

df2 = df.withColumn("Arr_of_Str", split(regexp_replace(col("Arr_of_Str"), '[\\[\\]]', ""), ","))

df2.show()

+---+-------------------+
| ID|         Arr_of_Str|
+---+-------------------+
|  1|        ["ABC DEF"]|
|  2|["PQR",  "ABC DEF"]|
+---+-------------------+

df2.printSchema()

root
 |-- ID: string (nullable = true)
 |-- Arr_of_Str: array (nullable = true)
 |    |-- element: string (containsNull = true)

推荐阅读