首页 > 解决方案 > 如何从 PySpark 列中同一子字符串的左侧和右侧提取字符?

问题描述

我的 Pyspark 数据框是这样的:

|ID|A|
+--+-------+
|1|7800028|
|2|700024|
|3|720004|
|4|70004|
|5|700004|

我想删除一起出现的 3 个零,并在单独的列中的三个零的左侧和右侧获取数字。像这样的东西:

|ID|B|C
+--+-------+
|1|78|28|
|2|7|24|
|3|72|4|
|4|7|4|
|5|70|4

问题是 col A 的长度可以不同,B 中的值范围为 0-99,C 中的值范围为 0-99。因此我似乎无法substring用来获得 B. C 仍然可以通过substring函数实现。

标签: pythonpysparksubstring

解决方案


您可以使用该模式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|
+---+-------+---+---+

推荐阅读