代码之家  ›  专栏  ›  技术社区  ›  Vasiliy Galkin

为什么连接两个spark数据帧会失败,除非我将“.as('alias)”添加到这两个数据帧中?

  •  0
  • Vasiliy Galkin  · 技术社区  · 6 年前

    假设出于任何原因,我们想加入2个Spark数据帧:

    val df1 = Seq(("A", 1), ("B", 2), ("C", 3)).toDF("agent", "in_count")
    val df2 = Seq(("A", 2), ("C", 2), ("D", 2)).toDF("agent", "out_count")
    

    可以使用如下代码完成:

    val joinedDf = df1.as('d1).join(df2.as('d2), ($"d1.agent" === $"d2.agent"))
    
    // Result:
    val joinedDf.show
    
    +-----+--------+-----+---------+
    |agent|in_count|agent|out_count|
    +-----+--------+-----+---------+
    |    A|       1|    A|        2|
    |    C|       3|    C|        2|
    +-----+--------+-----+---------+
    

    现在,我不明白的是,为什么只有在我使用别名的情况下它才能工作 df1.as(d1) df2.as(d2) ?我可以想象,如果我直截了当地这样写的话,专栏之间会有名称冲突

    val joinedDf = df1.join(df2, ($"df1.agent" === $"df2.agent")) // fails
    

    但是我不明白为什么我不能使用 .as(alias) 只有两个DF中的一个 :

    df1.as('d1).join(df2, ($"d1.agent" === $"df2.agent")).show()
    

    故障原因

    org.apache.spark.sql.AnalysisException: cannot resolve '`df2.agent`' given input columns: [agent, in_count, agent, out_count];;
    'Join Inner, (agent#25 = 'df2.agent)
    :- SubqueryAlias d1
    :  +- Project [_1#22 AS agent#25, _2#23 AS in_count#26]
    :     +- LocalRelation [_1#22, _2#23]
    +- Project [_1#32 AS agent#35, _2#33 AS out_count#36]
       +- LocalRelation [_1#32, _2#33]
    

    为什么最后一个示例无效?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Learner    6 年前

    使用alias时出现Hello DataFrame 已转换为 org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [agent: string, in_count: int] 所以你可以使用 $"d1.agent" 在那边

    如果要加入数据帧,可以执行以下操作:

    scala> val joinedDf = df1.join(df2, (df1("agent") === df2("agent")))
    joinedDf: org.apache.spark.sql.DataFrame = [agent: string, in_count: int ... 2 more fields]
    
    scala> joinedDf.show
    +-----+--------+-----+---------+
    |agent|in_count|agent|out_count|
    +-----+--------+-----+---------+
    |    A|       1|    A|        2|
    |    C|       3|    C|        2|
    +-----+--------+-----+---------+