Databricks:Python 用户定义函数,用于将几列的值与 DataFrame 中的 None 一起连接

问题描述 投票:0回答:1

我有多个 DataFrame,包括诸如

之类的值

数据帧1(df1):

EmpId  FirstName   LastName MiddleName  
1        Anna       Walter    I
2        Jack                 Shaun
3        Andrew     Hill

我需要将 FirstName、LastName、MiddleName 的值组合为:

Anna|Walter|I
Jack||Shaun
Andrew|Hill|

数据帧2(df2):

DeptId   DeptName   Category Contact  Building
10       Arts         1       James     7
20       Science      2         
30       Social               Kim       4

我需要将 DeptName、Category、Contact、Building 的值组合为:

Arts|1|James|7
Science|2||
Social||Kim|4

我需要一个用户定义的函数,我可以在类似的行中调用它:

fields1 = F.array('FirstName', 'LastName', 'MiddleName')
df1.withColumn('Combination1', udf_xyz(fields1))

fields2 = F.array('DeptName', 'Category', 'Contact', 'Building')
df2.withColumn('Combination2', udf_xyz(fields2))

我尝试了一个功能:

def concatdf_ws(df, colName, fields):
    df = df.fillna('')
    df = df.withColumn(colName, concat_ws('|', fields))
    df=df.select(*[when(trim(df[x])=='',None).otherwise(df[x]).alias(x) for x in df.columns])
    df.display()
    return df;

但是用 '' 填充每个空列并再次替换回来似乎非常昂贵,因为我们有数百万条记录。 有没有更好的办法。

python azure-databricks
1个回答
0
投票

您可以使用下面的用户定义函数将值与竖线(“|”)分隔符连接起来并处理空值:

def udf_xyz(fields):
    def concatdf_ws(*args):
        values = [arg if arg is not None else '' for arg in args]
        return '|'.join(map(str, values))
    
    return F.udf(concatdf_ws)

使用所需的详细信息调用 UDF,如下所示:

fields1 = ['FirstName', 'LastName', 'MiddleName']
fields2 = ['DeptName', 'Category', 'Contact', 'Building']

df1 = df1.withColumn('Combination1', udf_xyz(fields1)(*fields1))
df2 = df2.withColumn('Combination2', udf_xyz(fields2)(*fields2))

打印数据框,您将得到列 Combination1 和 Combination2,如下所示:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.