2017-07-26 47 views
2

以下代碼正常工作,直到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") 
        ^

這是爲什麼表現如此?

回答

3

.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 

它應該工作,然後

相關問題