2017-08-26 32 views
0
//dataset 
michael,swimming,silve,2016,USA 
usha,running,silver,2014,IND 
lisa,javellin,gold,2014,USA 
michael,swimming,silver,2017,USA 

問題 - 1)有多少枚銀牌已經贏得了美國在每項運動 - 和代碼拋出的誤差值== =不是字符串的部件SPARK SQL:如何通過多個colmuns篩選記錄,並使用GROUPBY太

val rdd = sc.textFile("/home/training/mydata/sports.txt") 
val text =rdd.map(lines=>lines.split(",")).map(arrays=>arrays(0),arrays(1),arrays(2),arrays(3),arrays(4)).toDF("first_name","sports","medal_type","year","country") 

text.filter(text("medal_type")==="silver" && ("country")==="USA" groupBy("year").count().show   

2)是什麼===和== 之間的差值當我使用過濾器,並與它只是一個條件(選擇具有===沒有& &或| |),它分別顯示了字符串結果和布爾結果,但是當我使用select和使用==過濾時,錯誤會拋出

回答

1

使用此:

text.filter(text("medal_type")==="silver" && text("country")==="USA").groupBy("year").count().show 

+----+-----+ 
|year|count| 
+----+-----+ 
|2017| 1| 
+----+-----+ 

將剛剛回答你的第一個問題。 (注意,在銀一個錯字在第一行)

關於第二個問題:

==和===只是在斯卡拉

在火花功能===使用equalTo方法,該方法是平等測試 https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/Column.html#equalTo-java.lang.Object-

// Scala: 
    df.filter(df("colA") === df("colB")) 

    // Java 
    import static org.apache.spark.sql.functions.*; 
    df.filter(col("colA").equalTo(col("colB"))); 

和==使用euqals方法,該方法只是測試如果兩個引用一個重新相同的對象。 https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/Column.html#equals-java.lang.Object-

通知返回類型的各功能的==(等於)返回布爾而===(equalTo)返回的結果的柱。

+0

感謝您的回覆@ykout。但第二個問題尚不清楚。因爲我是一個新手,並試圖從資源中理解,所以請隨我一起。和關於返回類型--- df.select($「_ c1」===「INDIA」)返回布爾值,而df.filter($「_ c1」===「INDIA」)返回各自的列 –

+0

事實上select()和filter()返回數據集並將列作爲參數,這就是爲什麼當您使用== 時它會失敗,但select與給定Column作爲參數完成不同的事情。篩選器()返回與給定列中的條件匹配的完整行,而select()返回所選列的條件結果列(布爾類型的列)。 這就像是說.select(..) 和spark.sql(「select * from country where country =='IND'」)for spark.sql(「select country =='IND'from text」)。將文本註冊爲臨時視圖後,過濾器(..) 。 – yakout