我有多个 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;
但是用 '' 填充每个空列并再次替换回来似乎非常昂贵,因为我们有数百万条记录。 有没有更好的办法。
您可以使用下面的用户定义函数将值与竖线(“|”)分隔符连接起来并处理空值:
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,如下所示: