在Pyspark中合并2个数据框

时间:2018-10-21 18:57:09

标签: pyspark

我有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。 谁能告诉我为什么会这样? 谢谢!

2 个答案:

答案 0 :(得分:0)

您共享的代码段可以正常工作。看起来加入的顺序与您在问题中所述的顺序不同。试试
df2.join(df1, on='field_B', 'field_C', 'field_D'], how='left')

如果可行,则数据帧的顺序与此处显示的顺序不同。

答案 1 :(得分:0)

基于此答案,您必须在下面的链接中使用unionDFs函数,然后使用groupbyhttps://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)