如何使用 pyspark 分解数据框中的逗号分隔值

问题描述 投票:0回答:1

我有如下数据:

ID               ID1                                  ID2
32336741        ["32361087"]                        ["36013040"]
32290433        ["32223150-32223653"]               ["36003347-36003348"]
32299856        ["32361087","32299991","32223653"]  ["36013040","36013029","36013040"]

在数据框中,我试图将逗号分隔的值分解为多行。 代码:

fulldf = (df
             .withColumn('ID1',F.explode(F.split('ID1','-')))
             .withColumn("ID1",F.regexp_replace("ID1", r"\[|\]|""\"", ""))
            )
fulldf = fulldf.dropna()
fulldf.display()

结果

ID              ID1
32336741        36013040
32290433        36003347
32290433        36003348
32290825        36013045
32290825        36013046
32290825        36013338

但是当我在数据框语法中添加列 ID2 时,它会为我提供多个记录,例如双倍记录。

预期输出

ID                ID1       ID2
32336741        32361087  36013040
32290433        32223150  36003347
32290433        32223653  36003348
32290825        32361087  36013045
32290825        32299991  36013046
32290825        32223653  36013338
python dataframe pyspark
1个回答
0
投票

如果示例中显示的内容一致,则只需提取数字,而不是拆分等。

>>> df = spark.createDataFrame([
        (32336741,'["32361087"]','["36013040"]'),
        (32290433,'["32223150-32223653"]','["36003347-36003348"]'),
        (32299856,'["32361087","32299991","32223653"]','["36013040","36013029","36013040"]'),
    ], schema='id: int, id1: string, id2: string')


>>> df.select(F.regexp_extract_all(df.id1, F.lit('(\d+)'))).show(truncate=False)
+---------------------------------+
|regexp_extract_all(id1, (\d+), 1)|
+---------------------------------+
|[32361087]                       |
|[32223150, 32223653]             |
|[32361087, 32299991, 32223653]   |
+---------------------------------+

>>> df.select(F.explode(F.regexp_extract_all(df.id1, F.lit('(\d+)'))).alias('id1_split')).show()
+---------+
|id1_split|
+---------+
| 32361087|
| 32223150|
| 32223653|
| 32361087|
| 32299991|
| 32223653|
+---------+

>>>

然后根据你想要的,你只需要加入/交叉加入原始 df 与这个分解的 df 就可以得到你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.