2017-07-26 18 views
2

aggの後にshowを追加するまで、次のコードは正常に機能します。 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での関数です。それはちょうどprintln

例のように、標準出力に出力し、Unit()を返します。

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

Scalaで、あなたはすべてが関数であり、何かを返すことを想定することができます。あなたのケースでは、Unit()が返されており、それはtempTableBに格納されています。

2

@philantrovertはすでに多くの詳細な説明で回答しています。だから私は説明しません。

tempTableBのwhatsを見たい場合は、以下のように割り当てられた後に行うことができます。

val tempTableB = tableB.groupBy("idB") 
    .agg(first("numB").as("numB")) 

tempTableB.show 

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

その後

を動作するはずです
関連する問題