【问题标题】:Handle string to array conversion in pyspark dataframe在 pyspark 数据框中处理字符串到数组的转换
【发布时间】:2018-10-25 16:47:05
【问题描述】:

我有一个文件(csv),当在 spark 数据帧中读取时,它的打印模式具有以下值

-- list_values: string (nullable = true)

list_values 列中的值类似于:

[[[167, 109, 80, ...]]]

是否可以将其转换为数组类型而不是字符串?

我尝试拆分它并使用在线提供的代码来解决类似问题:

df_1 = df.select('list_values', split(col("list_values"), ",\s*").alias("list_values"))

但是如果我运行上面的代码,我得到的数组会跳过原始数组中的很多值,即

以上代码的输出是:

[, 109, 80, 69, 5...

与原始数组不同,即(缺少 167)

[[[167, 109, 80, ...]]] 

由于我是 spark 新手,所以我不太了解它是如何完成的(对于 python,我本可以完成 ast.literal_eval 但 spark 没有这方面的规定。

所以我再重复一遍这个问题:

如何将存储为字符串的数组转换/转换为array,即

'[]' to [] conversion

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    假设您的 DataFrame 如下:

    df.show()
    #+----+------------------+
    #|col1|              col2|
    #+----+------------------+
    #|   a|[[[167, 109, 80]]]|
    #+----+------------------+
    
    df.printSchema()
    #root
    # |-- col1: string (nullable = true)
    # |-- col2: string (nullable = true)
    

    您可以使用pyspark.sql.functions.regexp_replace 删除前导方括号和尾随方括号。完成后,您可以在split ", " 上生成结果字符串:

    from pyspark.sql.functions import split, regexp_replace
    
    df2 = df.withColumn(
        "col3",
        split(regexp_replace("col2", r"(^\[\[\[)|(\]\]\]$)", ""), ", ")
    )
    df2.show()
    
    #+----+------------------+--------------+
    #|col1|              col2|          col3|
    #+----+------------------+--------------+
    #|   a|[[[167, 109, 80]]]|[167, 109, 80]|
    #+----+------------------+--------------+
    
    df2.printSchema()
    #root
    # |-- col1: string (nullable = true)
    # |-- col2: string (nullable = true)
    # |-- col3: array (nullable = true)
    # |    |-- element: string (containsNull = true)
    

    如果您希望将列作为整数数组,您可以使用 cast:

    from pyspark.sql.functions import col
    df2 = df2.withColumn("col3", col("col3").cast("array<int>"))
    df2.printSchema()
    #root
    # |-- col1: string (nullable = true)
    # |-- col2: string (nullable = true)
    # |-- col3: array (nullable = true)
    # |    |-- element: integer (containsNull = true)
    

    【讨论】:

    • 该方法(正则表达式替换就像一个魅力)然后转换为整数数组对我有用。赞成正确解决问题的答案。谢谢
    • @kunal 这里只有一种方法。如果要将生成的拆分数组从字符串数组转换为整数数组,则强制转换是可选的第二步。您也可以将它们合并为一个步骤:split(regexp_replace("col2", r"(^\[\[\[)|(\]\]\]$)", ""), ", ").cast("array&lt;int&gt;")。同样,这取决于您要如何处理数据。
    • 嘿 pault .. 我假设正则表达式会负责替换,第二步会将新创建的列替换为整数数组?
    • @kunal 是的。如果你注意到,我在最后一步覆盖了col3。它正在对正则表达式+拆分的结果执行cast
    • 我猜trim(BOTH '[]' col2) 会比regexp_replace 更有效率
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 2019-12-28
    • 2016-11-06
    • 1970-01-01
    • 2021-05-14
    • 2016-08-30
    • 1970-01-01
    • 2017-12-19
    相关资源
    最近更新 更多