我想保持隻有一列加入dataframes使用。使用select()加入後似乎並不直接,因為真實的數據可能會有很多列或列名稱可能不被人知道的。下麵一個簡單的例子
llist =[(“鮑勃”,“2015-01-13”,4),(“愛麗絲”,“2015-04-23”,10)]地區指定基金= sqlContext.createDataFrame (llist,(“名字”,“日期”,'時間'])打印ddf.collect () up_ddf = sqlContext。createDataFrame([(“愛麗絲”,100年),(“鮑勃”、23)],[“名稱”,“上傳”]) 這讓“名稱”列當我們隻需要一個!df =地區指定基金。加入(up_ddf ddf.name = = up_ddf.name)打印ddf.collect()顯示(ddf.select (ddf.name, ddf.duration / ddf.upload .alias (duration_per_upload)))
執行上麵顯示導致一個模棱兩可的名字錯誤:
org.apache.spark.sql。AnalysisException:引用“名字”是模棱兩可的,可以是:名字# 8484,# 8487。
錯誤可以避免通過使用從右手dataframe up_ddf.name加入
ddf.select (up_ddf.name……
但是似乎尷尬。有沒有更好的方法加入兩個dataframes和隻有一個“名稱”列?
在python中,我們可以解決這個問題:
和在java中,我們可以使用:
公共數據集<行>加入(數據集< ?>對,scala.collection。Seq <字符串> usingColumns,字符串joinType)
更多的http://spark.apache.org/docs/2.1.0/api/java/index.html
根據問題:
http://stackoverflow.com/questions/35988315/convert-java-list-to-scala-seq
的usingColumns參數可以定義為ArrayList。
這是一個預期行為。
DataFrame.join
這樣的方法是等價的SQL join
SELECT * FROM joinExprs加入b
如果你想忽略重複的列隻是下降他們感興趣的或選擇列。如果你想消除歧義可以使用訪問這些使用父
DataFrames
:
瓦爾:DataFrame = ? ? ?val b: DataFrame = ? ? ?val joinExprs:列= ? ? ?
一個。加入(b, joinExprs) .select ((" id "), b (" foo ")) / /下降相當於a.alias (“a”) . join (b.alias (b), joinExprs) .drop (b (" id ")) .drop ((" foo "))
或者使用別名:
/ /對於現在的別名不處理掉a.alias (“a”) . join (b.alias (b), joinExprs) .select ($”。id”,“b.foo”)