Python 如何在PySpark列中从子字符串的左侧和同一子字符串的右侧提取字符?
我的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
|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仍然是可行的。使用PySparksplit()
函数来分割列“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|
+---+-------+---+---+