1 回答
TA貢獻(xiàn)1895條經(jīng)驗 獲得超3個贊
以下是我可以使用 SparkSQL 2.4.0+內(nèi)置函數(shù)過濾器執(zhí)行的操作:
from pyspark.sql.functions import expr
df.withColumn('text_new', expr('filter(text, x -> x rlike "^Z?[0-9]{4,6}$")')) \
.show(truncate=False)
#+-----------------------------------+---------------------+
#|text |text_new |
#+-----------------------------------+---------------------+
#|[AZE, POI, 76759, T86420, ADAPT] |[76759] |
#|[SDN, 34, Z8735, AZE, 21054, 20126]|[Z8735, 21054, 20126]|
#+-----------------------------------+---------------------+
結(jié)果是一個包含匹配項的數(shù)組。正則表達(dá)式^Z?[0-9]{4,6}$匹配 4-6 位可選地前面有字符“Z”的數(shù)字。
編輯:對于舊版本的 Apache Spark,使用udf():
import re
from pyspark.sql.functions import udf
from pyspark.sql.types import ArrayType, StringType
# regex pattern:
ptn = re.compile('^Z?[0-9]{4,6}$')
# create an udf to filter array
array_filter = udf(lambda arr: [ x for x in arr if re.match(ptn, x) ] if type(arr) is list else arr, ArrayType(StringType()))
df.withColumn('text_new', array_filter('text')) \
.show(truncate=False)
Edit-2:根據(jù)您的評論,從 'Z' 到 'MOD' 并刪除前導(dǎo)MOD,使用 lstrip() 刪除此子字符串。調(diào)整以下:
ptn = re.complie(r'^(?:MOD)?[0-9]{4,6}$')
array_filter = udf(lambda arr: [ x.lstrip('MOD') for x in arr if re.match(ptn, x) ] if type(arr) is list else arr, ArrayType(StringType()))
添加回答
舉報
