将列表为StringType的PySpark数据框列转换为ArrayType

vzgqcmou  于 2022-12-17  发布在  Spark
关注(0)|答案(1)|浏览(144)

我得到了一个输入pysaprk Dataframe ,如下所示:

df = spark.createDataFrame(
    [("1111", "[clark, john, silvie]"),
     ("2222", "[bob, charles, seth]"),
     ("3333", "[jane, luke, adam]"),  
    ],
    ["column1", "column2"]
)
| column1 | column2 |
| ------- | ------- |
| 1111    | [clark kent, john, silvie] |
| 2222    | [bob, charles, seth rog]  |
| 3333    | [jane, luke max, adam]    |

我的目标是将列和值从StringType()中的column2转换为StringType()的ArrayType()。
但是我只得到了将其转换为ArrayType的部分结果,但是字符串列表中包含多个单词的那些值被单独拆分,如下所示:

from pyspark.sql.functions import expr

df_out = df.withColumn('column2', expr(r"regexp_extract_all(column2, '(\\w+)', 1)"))

这会得到如下结果(我的正则表达式技能不是很好):

| column1 | column2 |
| ------- | ------- |
| 1111    | ["clark", "kent", "john", "silvie"] |
| 2222    | ["bob", "charles", "seth", "rog"]  |
| 3333    | ["jane", "luke", "max", "adam"]    |

但实际上我希望得到这样的东西:

| column1 | column2 |
| ------- | ------- |
| 1111    | ["clark kent", "john", "silvie"] |
| 2222    | ["bob", "charles", "seth rog"]  |
| 3333    | ["jane", "luke max", "adam"]    |
nmpmafwu

nmpmafwu1#

你的输出与输入相比不好。无论如何修改输入。让我知道这是否是你想要的
使用translate替换角括号。用逗号分隔结果

df = spark.createDataFrame(
    [("1111", "[clark kent, john, silvie]"),
     ("2222", "[bob, charles, seth rog]"),
     ("3333", "[jane, luke max, adam]"),  
    ],
    ["column1", "column2"]
)


df.withColumn('column2',split(translate('column2','[]',''),'\,')).show(truncate=False)

+-------+----------------------------+
|column1|column2                     |
+-------+----------------------------+
|1111   |[clark kent,  john,  silvie]|
|2222   |[bob,  charles,  seth rog]  |
|3333   |[jane,  luke max,  adam]    |
+-------+----------------------------+

相关问题