删除 pyspark 数据帧中的空格
Posted
技术标签:
【中文标题】删除 pyspark 数据帧中的空格【英文标题】:Remove whitespaces in pyspark dataframes 【发布时间】:2020-06-26 18:57:14 【问题描述】:我有一个数据框,其架构如下:
root
|-- key: string (nullable = true)
|-- value: array (nullable = true)
| |-- element: string (containsNull = true)
我想删除值列中数组的每个元素中的第一个空格(如果存在) 从 pyspark.sql.functions 导入 regexp_replace 我想它会像下面的代码:
df.select(regexp_replace(col("values"), \s*, *)).show()
df:
+---+------------------------+
|key| value|
+---+------------------------+
| k1| [ x1 x2, x3, x4]|
| k2| [x5, x6 x7, x8]|
| k3|[ x9 x10, x11, x12 x13]|
+---+------------------------+
预期结果:
+---+------------------------+
|key| value|
+---+------------------------+
| k1| [x1 x2, x3, x4]|
| k2| [x5, x6 x7, x8]|
| k3| [x9 x10, x11, x12 x13]|
+---+------------------------+
(必须消除数组元素之前的所有空格) 谢谢
【问题讨论】:
您能否添加示例输入数据和预期输出以使问题更清晰 【参考方案1】:使用 posexplode
更新first space
(如果存在)。
df.show()
#+---+----------------+
#|key| value|
#+---+----------------+
#| 1| [a b, b c, c d]|
#| 2|[z x, xu, l z u]|
#+---+----------------+
from pyspark.sql.functions import *
df.selectExpr("key","posexplode(value)").withColumn("col",when(col("pos") ==0,regexp_replace(col('col'),' ','').otherwise(col("col")))).show()
#+---+---------------+
#|key| value|
#+---+---------------+
#| 1| [ab, b c, c d]|
#| 2|[zx, xu, l z u]|
#+---+---------------+
对于在开始时替换空格,您可以使用
Spark-2.4+:
#+---+-----------------------+
#|key|value |
#+---+-----------------------+
#|1 |[ a b i, b c, c d]|
#|2 |[ z x u, xu, l z u] |
#+---+-----------------------+
df.selectExpr("transform(value, x -> regexp_replace(x,'^\\\s+','')) as dd").show(10,False)
#+------------------+
#|dd |
#+------------------+
#|[a b i, b c, c d] |
#|[z x u, xu, l z u]|
#+------------------+
For Spark <2.4:
df.selectExpr("key","explode(value)").withColumn("value",regexp_replace(col("col"),"^\\s+",'')).groupBy(col("key")).agg(collect_list(col("value"))).show()
#+---+-------------------+
#|key|collect_list(value)|
#+---+-------------------+
#| 1| [a b i, b c, c d]|
#| 2| [z x u, xu, l z u]|
#+---+-------------------+
【讨论】:
谢谢。但我希望它只适用于每个元素的开头。我举了一个预期结果的例子【参考方案2】:仅用于删除字符串开头的空格。使用ltrim
# Input DF
df.show(truncate=False)
+---+------------------------+
|key|value |
+---+------------------------+
|1 |[ x1 x2, x3, x4 ] |
|2 |[x5, x6 x7, x8] |
|2 |[ x9 x10, x11, x12 x13]|
+---+------------------------+
df.withColumn("value", F.expr('''transform(value, x-> ltrim(x))''')).show(truncate=False)
+---+----------------------+
|key|value |
+---+----------------------+
|1 |[x1 x2, x3, x4 ] |
|2 |[x5, x6 x7, x8] |
|2 |[x9 x10, x11, x12 x13]|
+---+----------------------+
【讨论】:
谢谢。但我希望它只适用于每个元素的开头。我举了一个预期结果的例子 @Sadek,您可以使用ltrim
删除每个元素开头的任何空格。
感谢您的帮助。和@Shu 提出的一样,效果很好以上是关于删除 pyspark 数据帧中的空格的主要内容,如果未能解决你的问题,请参考以下文章
如果 pyspark 数据帧的行基于两列的值位于另一个数据帧中,如何删除它们?