【问题标题】:Why is join not possible after show operator?为什么显示运算符后无法加入?
【发布时间】:2018-01-01 11:37:13
【问题描述】:

在我在agg 之后添加show 之前,以下代码可以正常工作。为什么show 不可能?

 val tempTableB = tableB.groupBy("idB")
  .agg(first("numB").as("numB")) //when I add a .show here, it doesn't work

 tableA.join(tempTableB, $"idA" === $"idB", "inner")
 .drop("idA", "numA").show

错误提示:

error: overloaded method value join with alternatives:
  (right: org.apache.spark.sql.Dataset[_],joinExprs: org.apache.spark.sql.Column,joinType: String)org.apache.spark.sql.DataFrame <and>
  (right: org.apache.spark.sql.Dataset[_],usingColumns: Seq[String],joinType: String)org.apache.spark.sql.DataFrame
 cannot be applied to (Unit, org.apache.spark.sql.Column, String)
              tableA.join(tempTableB, $"idA" === $"idB", "inner")
                     ^

为什么会这样?

【问题讨论】:

    标签: scala apache-spark join apache-spark-sql


    【解决方案1】:

    .show() 是一个函数,我们在 Scala 中称之为副作用。它打印到标准输出并返回Unit(),就像println

    例子:

    val a  = Array(1,2,3).foreach(println)
    a: Unit = ()
    

    在 scala 中,你可以假设一切都是函数并且会返回一些东西。在您的情况下,Unit() 被返回,这就是存储在 tempTableB 中的内容。

    【讨论】:

      【解决方案2】:

      @philantrovert 已经回答了很多详细的解释。所以我就不解释了。

      如果您想查看 tempTableB 中的内容,您可以做什么,然后您可以在它被分配后执行以下操作。

       val tempTableB = tableB.groupBy("idB")
        .agg(first("numB").as("numB")) 
      
       tempTableB.show
      
       tableA.join(tempTableB, $"idA" === $"idB", "inner")
       .drop("idA", "numA").show
      

      它应该可以工作

      【讨论】:

        猜你喜欢
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多