我有2个数据框,如下所示:
DF1:
checkProfile() {
return new Observable((observer) => {
if (this.userRole) {
observer.next();
observer.complete();
} else {
this.callAuthApi().pipe(
map((customer) => {
if (!customer || customer.hasRole() === "anonymous") {
observer.error(new Error(AuthService.AUTH_ERROR_ROLE));
observer.complete();
}
this.userRole = customer.getRole();
observer.next();
observer.complete();
})
);
}
});
}
DF2:
Id | field_A | field_B | field_C | field_D
1 | cat | 12 | black | 11
2 | dog | 128 | white | 19
3 | dog | 35 | yellow | 20
4 | dog | 21 | brown | 4
5 | bird | 10 | blue | 7
6 | cow | 99 | brown | 34
在合并之后,我希望获得以下数据框:
Id | field_B | field_C | field_D | field_E
3 | 35 | yellow | 20 | 123
5 | 10 | blue | 7 | 454
6 | 99 | brown | 34 | 398
但是我得到以下数据框:
Id | field_A | field_B | field_C | field_D | field_E
1 | cat | 12 | black | 11 |
2 | dog | 128 | white | 19 |
3 | dog | 35 | yellow | 20 | 123
4 | dog | 21 | brown | 4 |
5 | bird | 10 | blue | 7 | 454
6 | cow | 99 | brown | 34 | 398
我正在使用以下语法:
Id | field_A | field_B | field_C | field_D | field_E
3 | dog | 35 | yellow | 20 | 123
5 | bird | 10 | blue | 7 | 454
6 | cow | 99 | brown | 34 | 398
我正在研究Spark 2.2。 谁能告诉我为什么会这样? 谢谢!
答案 0 :(得分:0)
您共享的代码段可以正常工作。看起来加入的顺序与您在问题中所述的顺序不同。试试
df2.join(df1, on='field_B', 'field_C', 'field_D'], how='left')
如果可行,则数据帧的顺序与此处显示的顺序不同。
答案 1 :(得分:0)
基于此答案,您必须在下面的链接中使用unionDFs
函数,然后使用groupby
。
https://stackoverflow.com/a/50665187/6645617
这是执行此操作的示例代码:
from pyspark.sql.functions import first
unionDF = unionDFs(DF1,DF2)
firstCols = [first(col).alias(str(col)) for col in unionDF.columns[1:]]
finalDF = unionDF.groupby("Id").agg(*firstCols)