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 索引数组中的主要内容,如果未能解决你的问题,请参考以下文章