正则表达式在 PySpark Dataframe 列中查找所有不包含 _(Underscore) 和 :(Colon) 的字符串
Posted
技术标签:
【中文标题】正则表达式在 PySpark Dataframe 列中查找所有不包含 _(Underscore) 和 :(Colon) 的字符串【英文标题】:Regular expression to find all the string that does not contains _(Underscore) and :(Colon) in PySpark Dataframe column 【发布时间】:2020-07-21 06:59:39 【问题描述】:我在数据框中有一列名为 "tags"。我需要根据条件提取值。条件是它不应包含 _(下划线) 和 :(冒号)。
例如:
"tags": "你好,amount_10,amount_90,total:100"
预期结果:
“new_column”:“嗨,你好”
供您参考:
我提取了所有的金额标签
collectAmount = udf(lambda s: list(map(lambda amount: amount.split('_')[1] if len(collection) > 0
else amount, re.findall(r'(amount_\w+)', s))), ArrayType(StringType()))
productsDF = productsDF.withColumn('amount_tag', collectAmount('tags'))
【问题讨论】:
我们应该先用,
分割单词吗?
标签列的类型是什么?你能创建一个minimal reproducible example吗?
是的,@Ankur。你是对的.....
标签的类型是 String.... @cronoik
【参考方案1】:
试试这个
df.withColumn('new_column',expr('''concat_ws(',',array_remove(transform(split(tags,','), x -> regexp_extract(x,'^(?!.*_)(?!.*:).+$',0)),''))''')).show(2,False)
+-------------------------------------------+----------+
|tags |new_column|
+-------------------------------------------+----------+
|hai, hello, amount_10, amount_90, total:100|hai, hello|
|hai, hello, amount_10, amount_90, total:100|hai, hello|
+-------------------------------------------+----------+
【讨论】:
完美...! @Shubham 耆那教 使用更简单的正则表达式,regexp_extract(x,'^[^_:]+$',0)
【参考方案2】:
真的不需要正则表达式:
tags = ["hai", "hello", "amount_10", "amount_90", "total:100"]
new_column = [tag for tag in tags if not any(junk in tag for junk in ["_", ":"])]
print(new_column)
如果你坚持使用正则表达式:
import re
rx = re.compile(r'^(?!.*_)(?!.*:).+$')
new_column = [tag for tag in tags if rx.match(tag)]
print(new_column)
见a demo on regex101.com。
【讨论】:
你好@Jan。这不是python中的普通列表。它是 pyspark 数据框。【参考方案3】:您可以按照上面的答案使用正则表达式,但您需要将其包装在 udf
中,或者如下所示,使用 pyspark
内置函数:
from pyspark.sql import functions as F
df= df.withColumn("extracted", F.regexp_extract("tags","[_:]", 0))
df.filter(df["extracted"] == '').select("tags").show()
【讨论】:
它没有给出确切的结果@ags29。 +----------+ |plain_tags| +----------+ | :| | _| | _| | _|我一个人搞定这个 是的,请。如果你能提供一个样本,那么我会修改我的答案。以上是关于正则表达式在 PySpark Dataframe 列中查找所有不包含 _(Underscore) 和 :(Colon) 的字符串的主要内容,如果未能解决你的问题,请参考以下文章