为什么show show之后无法加入?

时间:2017-07-26 08:53:21

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

以下代码可以正常工作,直到我在show之后添加agg。为什么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")
                     ^

为什么这样做?

2 个答案:

答案 0 :(得分:3)

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

一样

示例:

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

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

答案 1 :(得分: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

它应该工作