sparkDataframe联接:来自第一个Dataframe的不匹配记录

oprakyz7  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(398)

嗨,我有2个Dataframe,我正在这些Dataframe上应用一些连接条件。1.在连接条件之后,我希望第一个Dataframe中的所有数据,其名称、id、代码、lastname与第二个Dataframe不匹配。我已经编写了下面的代码。

val df3=df1.join(df2,df1("name") !==  df2("name_2")  && 
    df1("id") !== df2("id_2") &&
    df1("code") !==  df2("code_2") && 
    df1("lastname") !==  df2("lastname_2"),"inner")
    .drop(df2("id_2"))
    .drop(df2("name_2"))
    .drop(df2("code_2"))
    .drop(df2("lastname"))

预期结果。

DF1
    id,name,code,lastname
    1,A,001,p1
    2,B,002,p2
    3,C,003,p3

    DF2
    id_2,name_2,code_2,lastname_2
    1,A,001,p1
    2,B,002,p4
    4,D,004,p4

    DF3
    id,name,code,lastname
    3,C,003,p3

有人能帮助我这是正确的方式做这件事还是我应该使用sql内部查询与'不在'?。我是新的Spark和使用第一次Dataframe的方法,所以我不确定这是正确的方式与否?

izkcnapc

izkcnapc1#

我建议您使用spark api来处理数据:

val df1 =
          Seq((1, "20181231"), (2, "20190102"), (3, "20190103"), (4, "20190104"), (5, "20190105")).toDF("id", "date")

        val df2 =
          Seq((1, "20181231"), (2, "20190102"), (4, "20190104"), (5, "20190105")).toDF("id", "date")

选项1。您可以获取其他Dataframe中不包含的所有行:

val df3=df1.except(df2)

选项2。您可以使用特定字段进行反联接,例如“id”:

val df3 = df1.as("table1").join(df2.as("table2"), $"table1.id" === $"table2.id", "leftanti")

    df3.show()

相关问题