我真的希望能够在spark Dataframe 的整个列上运行复杂的函数,就像我在Pandas中使用apply函数所做的那样。
例如,在Pandas中,我有一个apply函数,它接受像www.example.com这样混乱的域sub-subdomain.subdomain.facebook.co.nz/somequerystring,只输出facebook.com。
在Spark我该怎么做?
我已经看过UDF,但我不清楚如何在单个列上运行它。
假设我有一个简单的函数,如下所示,我从PandasDF列中提取日期的不同部分:
def format_date(row):
year = int(row['Contract_Renewal'][7:])
month = int(row['Contract_Renewal'][4:6])
day = int(row['Contract_Renewal'][:3])
date = datetime.date(year, month, day)
return date-now
在《Pandas》中我会这样称呼它:
df['days_until'] = df.apply(format_date, axis=1)
我能在Pyspark中实现同样的目标吗?
2条答案
按热度按时间qxgroojn1#
在这种情况下,您可以使用
regexp_extract
(http:API?突出显示=子字符串#pyspark.sql.functions.regexp_extract)、regexp_replace
(http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?突出显示=子字符串#pyspark.sql.functions.regexp_replace)和split
(http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?突出显示=子字符串#pyspark.sql.functions.split)的某种组合来重新格式化字符串的日期。它不像定义自己的函数和使用像Pandas那样的
apply
那样干净,但它应该比定义Pandas/Spark UDF更有性能。祝你好运!
xzlaal3s2#
最新版本的PySpark提供了一种利用panda来运行apply()函数的方法。