Trim Pyspark 数据框中的字符串字符

Trim String Characters in Pyspark dataframe

假设我有数据框,其中的列中有值,例如:

ABC00909083888
ABC93890380380
XYZ7394949
XYZ3898302
PQR3799_ABZ
MGE8983_ABZ

我想 trim 这些值,如以 ABZ 结尾的删除前 3 个字符和最后 3 个字符。

00909083888
93890380380
7394949
3898302
3799
8983

尝试了一些方法但没有用。

from pyspark.sql import functions as f

new_df = df.withColumn("new_column", f.when((condition on some column),
                                               f.substring('Existing_COL', 4, f.length(f.col("Existing_COL"))), ))
       

任何人都可以告诉我我可以在 pyspark 中使用哪个功能。 Trim 仅删除白色 space 或制表符。

基于您的输入和预期输出。看下面的逻辑-

from pyspark.sql.functions import *

df = spark.createDataFrame(data = [("ABC00909083888",) ,("ABC93890380380",) ,("XYZ7394949",) ,("XYZ3898302",) ,("PQR3799_ABZ",) ,("MGE8983_ABZ",)], schema = ["values",])

(df.withColumn("new_vals", when(col('values').rlike("(_ABZ$)"), regexp_replace(col('values'),r'(_ABZ$)', '')).otherwise(col('values')))
  .withColumn("final_vals", expr(("substring(new_vals, 4 ,length(new_vals))")))
).show()

输出

+--------------+--------------+-----------+
|        values|      new_vals| final_vals|
+--------------+--------------+-----------+
|ABC00909083888|ABC00909083888|00909083888|
|ABC93890380380|ABC93890380380|93890380380|
|    XYZ7394949|    XYZ7394949|    7394949|
|    XYZ3898302|    XYZ3898302|    3898302|
|   PQR3799_ABZ|       PQR3799|       3799|
|   MGE8983_ABZ|       MGE8983|       8983|
+--------------+--------------+-----------+

如果我没听错,如果你不坚持使用 pyspark 子字符串或 trim 函数,你可以轻松定义一个函数来做你想做的事,然后使用 udfs 在火花中:

from pyspark.sql.types import StringType
from pyspark.sql.functions import udf


def mysub(word):
  if word.endswith('_ABZ'):
    word = word[:-4]
  return word[3:]


udf1 = udf(lambda x: mysub(x), StringType())
df.withColumn('new_label',udf1('label')).show()

输出如下:

+---+--------------+-----------+
| id|         label|  new_label|
+---+--------------+-----------+
|  1|ABC00909083888|00909083888|
|  2|ABC93890380380|93890380380|
|  3|    XYZ7394949|    7394949|
|  4|    XYZ3898302|    3898302|
|  5|   PQR3799_ABZ|       3799|
|  6|   MGE8983_ABZ|       8983|
+---+--------------+-----------+

如果在某些情况下我理解错了,请告诉我。