我们可以在 UDF 中使用关键字参数吗
Can we use keyword arguments in UDF
我的问题是我们可以像下面那样在 Pyspark 中使用关键字参数和 UDF。 conv 方法有一个关键字参数 conv_type ,默认情况下它被分配给特定类型的格式化程序但是我想在某些地方指定不同的格式。由于关键字参数,这在 udf 中没有通过。这里有使用关键字参数的不同方法吗?
from datetime import datetime as dt, timedelta as td,date
tpid_date_dict = {'69': '%d/%m/%Y', '62': '%Y/%m/%d', '70201': '%m/%d/%y', '66': '%d.%m.%Y', '11': '%d-%m-%Y', '65': '%Y-%m-%d'}
def date_formatter_based_on_id(column, date_format):
val = dt.strptime(str(column),'%Y-%m-%d').strftime(date_format)
return val
def generic_date_formatter(column, date_format):
val = dt.strptime(str(column),date_format).strftime('%Y-%m-%d')
return val
def conv(column, id, conv_type=date_formatter_based_on_id):
try:
date_format=tpid_date_dict[id]
except KeyError as e:
print("Key value not found!")
val = None
if column:
try:
val = conv_type(column, date_format)
except Exception as err:
val = column
return val
conv_func = functions.udf(conv, StringType())
date_formatted = renamed_cols.withColumn("check_in_std",
conv_func(functions.col("check_in"), functions.col("id"),
generic_date_formatter))
所以问题出在最后一条语句(date_formatted = renamed_cols.withColumn("check_in_std",
conv_func(functions.col("check_in"), functions.col("id"),
generic_date_formatter)))
由于第三个参数 generic_date_formatter 是关键字参数。
尝试此操作时出现以下错误:
AttributeError: 'function' 对象没有属性 '_get_object_id'
很遗憾,您不能将 udf
与关键字参数一起使用。 UserDefinedFunction.__call__
is defined with positional arguments only:
def __call__(self, *cols):
judf = self._judf
sc = SparkContext._active_spark_context
return Column(judf.apply(_to_seq(sc, cols, _to_java_column)))
但是您遇到的问题与关键字参数并没有真正的关系。你会得到异常,因为 generic_date_formatter
不是 Column
对象而是一个函数。
您可以动态创建 udf
:
def conv(conv_type=date_formatter_based_on_id):
def _(column, id):
try:
date_format=tpid_date_dict[id]
except KeyError as e:
print("Key value not found!")
val = None
if column:
try:
val = conv_type(column, date_format)
except Exception as err:
val = column
return val
return udf(_, StringType())
可以调用:
conv_func(generic_date_formatter)(functions.col("check_in"), functions.col("id"))
检查 了解详情。
我的问题是我们可以像下面那样在 Pyspark 中使用关键字参数和 UDF。 conv 方法有一个关键字参数 conv_type ,默认情况下它被分配给特定类型的格式化程序但是我想在某些地方指定不同的格式。由于关键字参数,这在 udf 中没有通过。这里有使用关键字参数的不同方法吗?
from datetime import datetime as dt, timedelta as td,date
tpid_date_dict = {'69': '%d/%m/%Y', '62': '%Y/%m/%d', '70201': '%m/%d/%y', '66': '%d.%m.%Y', '11': '%d-%m-%Y', '65': '%Y-%m-%d'}
def date_formatter_based_on_id(column, date_format):
val = dt.strptime(str(column),'%Y-%m-%d').strftime(date_format)
return val
def generic_date_formatter(column, date_format):
val = dt.strptime(str(column),date_format).strftime('%Y-%m-%d')
return val
def conv(column, id, conv_type=date_formatter_based_on_id):
try:
date_format=tpid_date_dict[id]
except KeyError as e:
print("Key value not found!")
val = None
if column:
try:
val = conv_type(column, date_format)
except Exception as err:
val = column
return val
conv_func = functions.udf(conv, StringType())
date_formatted = renamed_cols.withColumn("check_in_std",
conv_func(functions.col("check_in"), functions.col("id"),
generic_date_formatter))
所以问题出在最后一条语句(date_formatted = renamed_cols.withColumn("check_in_std", conv_func(functions.col("check_in"), functions.col("id"), generic_date_formatter))) 由于第三个参数 generic_date_formatter 是关键字参数。
尝试此操作时出现以下错误: AttributeError: 'function' 对象没有属性 '_get_object_id'
很遗憾,您不能将 udf
与关键字参数一起使用。 UserDefinedFunction.__call__
is defined with positional arguments only:
def __call__(self, *cols):
judf = self._judf
sc = SparkContext._active_spark_context
return Column(judf.apply(_to_seq(sc, cols, _to_java_column)))
但是您遇到的问题与关键字参数并没有真正的关系。你会得到异常,因为 generic_date_formatter
不是 Column
对象而是一个函数。
您可以动态创建 udf
:
def conv(conv_type=date_formatter_based_on_id):
def _(column, id):
try:
date_format=tpid_date_dict[id]
except KeyError as e:
print("Key value not found!")
val = None
if column:
try:
val = conv_type(column, date_format)
except Exception as err:
val = column
return val
return udf(_, StringType())
可以调用:
conv_func(generic_date_formatter)(functions.col("check_in"), functions.col("id"))
检查