首页 > 解决方案 > Pyspark 数据帧拆分并将分隔列值填充到 N 索引数组中

问题描述

有一个 pyspark 源数据框有一个名为 X 的列。X 列由“-”分隔值组成。该特定列中可以有任意数量的分隔值。下面给出的源数据框示例:

X
A123-B345-C44656-D4423-E3445-F5667
X123-Y345
Z123-N345-T44656-M4423
X123

现在,需要使用分隔符拆分此列并准确提取 N=4 单独的分隔值。如果有超过 4 个分隔值,那么我们需要前 4 个分隔值并丢弃其余的。如果分隔值少于 4 个,那么我们需要选择现有的值并用空字符 "" 填充其余的值。

结果输出应如下所示:

X Col1 Col2 Col3 Col4
A123-B345-C44656-D4423-E3445-F5667 A123 B345 C44656 D4423
X123-Y345 A123 Y345
Z123-N345-T44656-M4423 Z123 N345 T44656 M4423
X123 X123

按照下面的代码在 python 中很容易地完成了这个,但是考虑到 pyspark 方法来做到这一点:

    def pad_infinite(siterable, padding=None):
        return chain(iterable, repeat(padding))

    def pad(iterable, size, padding=None):
        return islice(pad_infinite(iterable, padding), size)
    
    colA, colB, colC, colD= list(pad(X.split('-'), 4, ''))

标签: pysparkapache-spark-sqluser-defined-functions

解决方案


您可以将字符串拆分为一个数组,将数组的元素分成列,然后用空字符串填充值:null

df = ...
df.withColumn("arr", F.split("X", "-")) \
    .selectExpr("X", "arr[0] as Col1", "arr[1] as Col2", "arr[2] as Col3", "arr[3] as Col4") \
    .na.fill("") \
    .show(truncate=False)

输出:

+----------------------------------+----+----+------+-----+
|X                                 |Col1|Col2|Col3  |Col4 |
+----------------------------------+----+----+------+-----+
|A123-B345-C44656-D4423-E3445-F5667|A123|B345|C44656|D4423|
|X123-Y345                         |X123|Y345|      |     |
|Z123-N345-T44656-M4423            |Z123|N345|T44656|M4423|
|X123                              |X123|    |      |     |
+----------------------------------+----+----+------+-----+

推荐阅读