将自定义函数应用于以数据框为参数的多个spark数据框

时间:2020-06-23 02:51:56

标签: dataframe lambda pyspark

全部

在处理3个大型数据帧aDf,bDf和cDf时,我有一个要求,我想“修剪”字符串列以删除空格。

from pyspark.sql.functions import trim, col
for col_name,col_dtype in aDf.dtypes:
    if col_dtype == "string":
       aDf = aDf.withColumn(col_name, trim(col(col_name)))
    else:
       aDf = aDf.withColumn(col_name, col(col_name))
        
for col_name,col_dtype in bDf.dtypes:
    if col_dtype == "string":
       bDf = bDf.withColumn(col_name, trim(col(col_name)))
    else:
       bDf = bDf.withColumn(col_name, col(col_name))
        
for col_name,col_dtype in cDf.dtypes:
    if col_dtype == "string":
       cDf = cDf.withColumn(col_name, trim(col(col_name)))
    else:
       cDf = cDf.withColumn(col_name, col(col_name))

有没有更好,更有效的方法来处理这种简单的转换。有将近40列,大约。每个数据帧中有100毫米的行。

尽管这可行,但我感觉甚至可以对数据框进行参数化。这样,代码就变得更加通用。

请使用任何指针..谢谢

1 个答案:

答案 0 :(得分:1)

您可以重复使用代码,但是花费的时间仍然相同

from functools import reduce
from pyspark.sql import functions as f

aDf = trimDF(aDf)
bDf = trimDF(bDf)
cDf = trimDF(cDf)

def trimDF(df):
    df = reduce(lambda df, col: df.withColumn(col[0],f.trim(f.col(col[0]))) if col[1]=='string' else df.withColumn(col[0],f.col(col[0])), df.dtypes, df)
    return df