【问题标题】:Read Array of Strings as Array in Pyspark from CSV从 CSV 读取字符串数组作为 Pyspark 中的数组
【发布时间】:2022-01-29 20:42:26
【问题描述】:

我有一个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-spark pyspark apache-spark-sql


    【解决方案1】:

    更新:

    实际上,您可以简单地使用from_jsonArr_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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2020-11-06
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多