Python 如何在阵列上使用
我有一个pyspark数据框架,它包含4列。我想从一列中提取一些字符串,它的类型是Python 如何在阵列上使用,python,pyspark,Python,Pyspark,我有一个pyspark数据框架,它包含4列。我想从一列中提取一些字符串,它的类型是字符串数组。 我使用了regexp\u extract函数,但它返回了一个错误,因为regexp\u extract只接受一个字符串 数据帧示例: id | last_name | age | Identificator ------------------------------------------------------------------ 12 | AA | 23 | "[""A
字符串数组
。
我使用了regexp\u extract
函数,但它返回了一个错误,因为regexp\u extract
只接受一个字符串
数据帧示例:
id | last_name | age | Identificator
------------------------------------------------------------------
12 | AA | 23 | "[""AZE","POI","76759","T86420","ADAPT"]"
------------------------------------------------------------------
24 | BB | 24 | "[""SDN","34","35","AZE","21054","20126"]"
------------------------------------------------------------------
我想提取以下所有数字:
- contain 4, 5 or 6 digits
- it should not attached to a letters.
- if attached to letter Z ok, I should extract it.
- save it in a new column in my Dataframe.
我开始这样做,但它不起作用,因为标题是一个字符串数组
expression = r'([0-9]){4,6}'
df = df.withColumn("extract", F.regexp_extract(F.col("Identificator"), expression, 1))
如何使用regexp\u extract或其他解决方案提取这些数字?
谢谢以下是我可以使用SparkSQL2.4.0+内置函数做的事情: 结果是一个包含匹配项的数组。regex
^Z?[0-9]{4,6}$
匹配4-6位数字,前面可选地加上字符“Z”
编辑:对于较旧版本的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:根据您的评论,从“Z”到“MOD”并删除前导的MOD
,使用lstrip()删除此子字符串。调整以下各项:
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()))
@verojoucla的最新版本是2.4.4@verojoucla你能在spark 2.4.4集群上测试一下吗?测试能够反映到您的生产环境中的代码更为实际。:)spark 3.0不稳定,有很多不确定性。你的意思是:spark 2.1.1和Scala 2.11?这是Spark的老版本,对吧?如果是这样,我将使用udf来完成此任务。@verojoucla我将在我的帖子中将单词从
2.40
更正为2.4.0
。我认为这可能会引起一些误解。这意味着,某些列值不是数组,很可能是无数组。您希望如何处理此类案件?
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()))