Pandas UDF 函数在大数据上的完成时间异常长
Pandas UDF Function Takes Unusually Long to Complete on Big Data
我是 PySpark 和 Pandas UDF 的新手,我是 运行 以下 Pandas UDF 函数,用于混淆包含字符串的列(例如:输入 'Luke' 将导致 'ulek')
pandas_udf("string")
def jumble_string(column: pd.Series)-> pd.Series:
return column.apply(lambda x: None if x==None else ''.join(random.sample(x, len(x))).lower())
spark_df = spark_df.withColumn("names", jumble_string("names"))
在 运行 对大型数据集执行上述函数时,我注意到执行时间异常长。
我猜 .apply
函数与此问题有关。
我是否可以重写此函数,使其可以在大数据集上有效执行?
请指教
Spark 中没有实现将列中的字符串打乱的函数,因此我们不得不求助于 UDF 或 Pandas UDF。
你的解决方案其实很好;也许我们可以通过从系列中删除 .apply
方法并在每一行的字符串上仅使用基础 Python 来改进它。
@pandas_udf("string")
def jumble_string_new(column: pd.Series)-> pd.Series:
x = column.iloc[0] # each pd.Series is made only of one element
if x is None:
return pd.Series([None])
else:
return pd.Series([''.join(random.sample(x, len(x))).lower()])
结果与您的函数相同;但是,我无法在非常大的数据帧上对其进行测试。自己尝试一下,看看它的计算效率是否更高。
由于 .apply
方法不是矢量化的,给定的操作是通过循环遍历元素来完成的,这会随着数据变大而减慢执行速度。
对于小数据,时间差通常可以忽略不计。然而,随着尺寸的增加,差异开始变得明显。我们可能会处理大量数据,因此应始终考虑时间。
您可以阅读有关应用与矢量化操作的更多信息here。
因此我决定使用列表推导式,它确实稍微提高了我的表现。
@pandas_udf("string")
def jumble_string(column: pd.Series)-> pd.Series:
return pd.Series([None if x==None else ''.join(random.sample(x, len(x))).lower() for x in column])
我是 PySpark 和 Pandas UDF 的新手,我是 运行 以下 Pandas UDF 函数,用于混淆包含字符串的列(例如:输入 'Luke' 将导致 'ulek')
pandas_udf("string")
def jumble_string(column: pd.Series)-> pd.Series:
return column.apply(lambda x: None if x==None else ''.join(random.sample(x, len(x))).lower())
spark_df = spark_df.withColumn("names", jumble_string("names"))
在 运行 对大型数据集执行上述函数时,我注意到执行时间异常长。
我猜 .apply
函数与此问题有关。
我是否可以重写此函数,使其可以在大数据集上有效执行? 请指教
Spark 中没有实现将列中的字符串打乱的函数,因此我们不得不求助于 UDF 或 Pandas UDF。
你的解决方案其实很好;也许我们可以通过从系列中删除 .apply
方法并在每一行的字符串上仅使用基础 Python 来改进它。
@pandas_udf("string")
def jumble_string_new(column: pd.Series)-> pd.Series:
x = column.iloc[0] # each pd.Series is made only of one element
if x is None:
return pd.Series([None])
else:
return pd.Series([''.join(random.sample(x, len(x))).lower()])
结果与您的函数相同;但是,我无法在非常大的数据帧上对其进行测试。自己尝试一下,看看它的计算效率是否更高。
由于 .apply
方法不是矢量化的,给定的操作是通过循环遍历元素来完成的,这会随着数据变大而减慢执行速度。
对于小数据,时间差通常可以忽略不计。然而,随着尺寸的增加,差异开始变得明显。我们可能会处理大量数据,因此应始终考虑时间。
您可以阅读有关应用与矢量化操作的更多信息here。
因此我决定使用列表推导式,它确实稍微提高了我的表现。
@pandas_udf("string")
def jumble_string(column: pd.Series)-> pd.Series:
return pd.Series([None if x==None else ''.join(random.sample(x, len(x))).lower() for x in column])