Python 如何在PySpark列中从子字符串的左侧和同一子字符串的右侧提取字符?

Python 如何在PySpark列中从子字符串的左侧和同一子字符串的右侧提取字符?,python,pyspark,substring,Python,Pyspark,Substring,我的Pyspark数据帧如下所示: |ID|A| +--+-------+ |1|7800028| |2|700024| |3|720004| |4|70004| |5|700004| |ID|B|C +--+-------+ |1|78|28| |2|7|24| |3|72|4| |4|7|4| |5|70|4 我想删除同时出现的3个零,并在单独的列中获得三个零左右的数字。 大概是这样的: |ID|A| +--+-------+ |1|7800028| |2|700024| |3|7200

我的Pyspark数据帧如下所示:

|ID|A|
+--+-------+
|1|7800028|
|2|700024|
|3|720004|
|4|70004|
|5|700004|
|ID|B|C
+--+-------+
|1|78|28|
|2|7|24|
|3|72|4|
|4|7|4|
|5|70|4
我想删除同时出现的3个零,并在单独的列中获得三个零左右的数字。 大概是这样的:

|ID|A|
+--+-------+
|1|7800028|
|2|700024|
|3|720004|
|4|70004|
|5|700004|
|ID|B|C
+--+-------+
|1|78|28|
|2|7|24|
|3|72|4|
|4|7|4|
|5|70|4
问题是A列的长度可能不同,B中的值范围为0-99,C中的值范围为0-99。
因此,我似乎无法使用
substring
来获得B。通过
substring
函数,C仍然是可行的。

使用PySpark
split()
函数来分割列“A”中的值。参考:


您可以使用模式
000(?=[1-9]|0$)
来分割字符串,其中
(?=[1-9]|0$)
是一个锚,以确保最后一个
0
后面必须跟一个非零位或零作为整数的最后一位,例如:

spark.sql("""
    with t as ( 
        select *, split(A,'000(?=[1-9]|0$)') as arr
        from values (1,7800028),(2,700024),(3,720004),(4,70004),(5,700004),(6,120000) as (id,A)
    ) 
    select id, A, arr[0] as B, arr[1] as C 
    from t
""").show()
+---+-------+---+---+
| id|      A|  B|  C|
+---+-------+---+---+
|  1|7800028| 78| 28|
|  2| 700024|  7| 24|
|  3| 720004| 72|  4|
|  4|  70004|  7|  4|
|  5| 700004| 70|  4|
|  6| 120000| 12|  0|
+---+-------+---+---+

我无法将其转换为Python dataframe,因为数据太大(1亿行),请尝试定义自己的方法来返回包含2个子字符串的元组。def func(字符串):返回str1、str2。然后将其注册为udf函数。然后在pyspark中使用withcolumn()将函数应用于单列中的所有行。我不知道这种方法是否有效,但请尝试一下。谢谢,但问题是在给我str1的udf中加入什么,str2@jxc它成功了,非常感谢。你可以在答案中加上这个,我会标记为正确。
new_df.show()

+---+-------+---+---+
| ID|      A|  B|  C|
+---+-------+---+---+
|  1|7800028| 78| 28|
|  2| 700024|  7| 24|
|  3| 720004| 72|  4|
|  4|  70004|  7|  4|
+---+-------+---+---+
spark.sql("""
    with t as ( 
        select *, split(A,'000(?=[1-9]|0$)') as arr
        from values (1,7800028),(2,700024),(3,720004),(4,70004),(5,700004),(6,120000) as (id,A)
    ) 
    select id, A, arr[0] as B, arr[1] as C 
    from t
""").show()
+---+-------+---+---+
| id|      A|  B|  C|
+---+-------+---+---+
|  1|7800028| 78| 28|
|  2| 700024|  7| 24|
|  3| 720004| 72|  4|
|  4|  70004|  7|  4|
|  5| 700004| 70|  4|
|  6| 120000| 12|  0|
+---+-------+---+---+