如何在 pyspark 的 pandas_udf 函数中使用正则表达式?
How to use regex within pandas_udf function in pyspark?
我的代码如下:
@pandas_udf(BooleanType())
def is_one(iterator: Iterator[pd.Series]) -> Iterator[pd.Series]:
for s in iterator:
res = re.search("1", s)
yield res != None
df = spark.createDataFrame(pd.DataFrame(["1", "2", "3"], columns=["v"]))
df.select(is_one(df.v)).show()
我遇到错误:
TypeError: expected string or bytes-like object
看来我的函数没有遍历字符串。这是为什么?我如何在 pandas_udf 中使用正则表达式函数?
我尝试了系列到系列的方法,但得到了同样的错误。
您可以在系列中使用 apply
来应用您的正则表达式搜索:
from pyspark.sql.functions import pandas_udf
from pyspark.sql.types import BooleanType
import pandas as pd
@pandas_udf(BooleanType())
def is_one(ser: pd.Series) -> pd.Series:
return ser.apply(lambda s: re.search("1", s) is not None)
# a neater way:
# return ser.str.contains("1")
df = spark.createDataFrame(pd.DataFrame(["1", "2", "3"], columns=["v"]))
df.select(is_one(df.v)).show()
+---------+
|is_one(v)|
+---------+
| true|
| false|
| false|
+---------+
我的代码如下:
@pandas_udf(BooleanType())
def is_one(iterator: Iterator[pd.Series]) -> Iterator[pd.Series]:
for s in iterator:
res = re.search("1", s)
yield res != None
df = spark.createDataFrame(pd.DataFrame(["1", "2", "3"], columns=["v"]))
df.select(is_one(df.v)).show()
我遇到错误:
TypeError: expected string or bytes-like object
看来我的函数没有遍历字符串。这是为什么?我如何在 pandas_udf 中使用正则表达式函数?
我尝试了系列到系列的方法,但得到了同样的错误。
您可以在系列中使用 apply
来应用您的正则表达式搜索:
from pyspark.sql.functions import pandas_udf
from pyspark.sql.types import BooleanType
import pandas as pd
@pandas_udf(BooleanType())
def is_one(ser: pd.Series) -> pd.Series:
return ser.apply(lambda s: re.search("1", s) is not None)
# a neater way:
# return ser.str.contains("1")
df = spark.createDataFrame(pd.DataFrame(["1", "2", "3"], columns=["v"]))
df.select(is_one(df.v)).show()
+---------+
|is_one(v)|
+---------+
| true|
| false|
| false|
+---------+