Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在阵列上使用_Python_Pyspark - Fatal编程技术网

Python 如何在阵列上使用

Python 如何在阵列上使用,python,pyspark,Python,Pyspark,我有一个pyspark数据框架,它包含4列。我想从一列中提取一些字符串,它的类型是字符串数组。 我使用了regexp\u extract函数,但它返回了一个错误,因为regexp\u extract只接受一个字符串 数据帧示例: id | last_name | age | Identificator ------------------------------------------------------------------ 12 | AA | 23 | "[""A

我有一个pyspark数据框架,它包含4列。我想从一列中提取一些字符串,它的类型是
字符串数组
。 我使用了
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()))