【问题标题】:Pyspark dataframe split and pad delimited column value into Array of N indexPyspark 数据帧拆分并将分隔列值填充到 N 索引数组中
【发布时间】: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, ''))

【问题讨论】:

    标签: pyspark apache-spark-sql user-defined-functions


    【解决方案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 答案。将其标记为已批准。
    猜你喜欢
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多