Pyspark 数据帧拆分并将分隔列值填充到 N 索引数组中

Posted

技术标签:

【中文标题】Pyspark 数据帧拆分并将分隔列值填充到 N 索引数组中【英文标题】:Pyspark dataframe split and pad delimited column value into Array of N index 【发布时间】:2021-07-21 06:31:19 【问题描述】:

有一个 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, ''))

【问题讨论】:

【参考方案1】:

您可以将split 字符串放入一个数组中,将数组中的元素into columns 和fill 中的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|    |      |     |
+----------------------------------+----+----+------+-----+

【讨论】:

Split 没有像预期的那样发生,并且一旦运行它就会截断我的其余数据帧列。上述任何步骤都没有影响,我尝试使用示例数据框,但看到相同的完整 df 截断。 @AmitSingh 你从spilt 看到了什么结果?列arr 应该是一个字符串数组。你得到这个数组了吗?预计会删除剩余的列。这发生在selectExpr 语句中。您可以将所有其他必需的列添加到列列表中,也可以尝试selectExpr("*", "arr[0]", ...) 抱歉!拆分正在返回预期的数组。如您所说, selectExpr 还需要一个 * 字符来保持所有其他列的完整性。非常感谢您的帮助,这是经过批准和预期的 Pyspark 答案。将其标记为已批准。

以上是关于Pyspark 数据帧拆分并将分隔列值填充到 N 索引数组中的主要内容,如果未能解决你的问题,请参考以下文章

如何拆分对象列表以分隔pyspark数据框中的列

如何使用 azure 数据工厂拆分列值

Pyspark 数据框将 json 列值拆分为***多列

在 PySpark 数据框中拆分和计算列值

如何在限制行数的同时拆分 Pyspark 数据帧?

pyspark 按列将数据帧拆分为几个数据帧