以下代码可以正常工作,直到我在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")
^
为什么这样做?
答案 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
它应该工作