Dataframe 删除pyspark数据帧中的空白

Dataframe 删除pyspark数据帧中的空白,dataframe,pyspark,Dataframe,Pyspark,我有一个dataframe,其模式如下: root |-- key: string (nullable = true) |-- value: array (nullable = true) | |-- element: string (containsNull = true) 我想删除value列中数组的每个元素中的第一个空格(如果存在) 从pyspark.sql.functions导入regexp\u replace 我想它会像下面的代码: df.select(regexp_re

我有一个dataframe,其模式如下:

root
 |-- key: string (nullable = true)
 |-- value: array (nullable = true)
 |    |-- element: string (containsNull = true)
我想删除value列中数组的每个元素中的第一个空格(如果存在) 从pyspark.sql.functions导入regexp\u replace 我想它会像下面的代码:

df.select(regexp_replace(col("values"), \s*, *)).show()
国防军:

+---+------------------------+
|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]|
+---+------------------------+
(必须消除数组元素前的所有空格)
感谢您仅删除字符串开头的空格。使用
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]|
    +---+----------------------+

使用
posexplode
更新
第一个空格(如果存在)

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]|
#+------------------+
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]|
#+---+-------------------+

对于Spark,您是否可以添加示例输入数据和预期输出,以使问题更加清晰谢谢。但我希望它只对每个元素的开头起作用。我举了一个预期的例子result@Sadek,您可以使用
ltrim
删除每个元素开头的任何空格。感谢您的帮助。和@Shu建议的一样,效果很好,谢谢。但我希望它只对每个元素的开头起作用。我举了一个预期结果的例子