2015-09-30 54 views
1

我在同名的列上加入了兩個數據幀。在SparkR 1.5.0中,如何在公共列上加入後明確指定列?

oe = join(orders, emp, orders$EmployeeID == emp$EmployeeID) 

所得數據幀有兩列具有相同名稱的EmployeeID

現在一組通過或者甚至在打印列名

peremp = groupBy(oe, 'EmployeeID', sales = n(oe$OrderID)) 
oe$EmployeeID 

失敗,並在invokeJava錯誤

錯誤(isStatic = FALSE,objId $ id,methodName,...):
或g.apache.spark.sql.AnalysisException:引用'EmployeeID'是 含糊不清,可能是:EmployeeID#36,EmployeeID#69。

回答

2

您可以通過父數據框訪問列。首先,讓我們創建一些示例數據:

df1 <- createDataFrame(sqlContext, data.frame(id=c(1, 2, 3), v=c("a", "b", "c"))) 
df2 <- createDataFrame(sqlContext, data.frame(id=c(2, 3), v=c("g", "z"))) 
df <- join(df1, df2, df1$id == df2$id) 
head(df) 
## id v id v 
## 1 3 c 3 z 
## 2 2 b 2 g 

並獲得v柱:

select(df, "v") 
## 15/09/30 17:47:13 ERROR RBackendHandler: select on 131 failed 
## Error in invokeJava(isStatic = FALSE, objId$id, methodName, ...) : 
## org.apache.spark.sql.AnalysisException: Reference 'v' is ambiguous, could be 
## .... 

select(df, df1$v) %>% head 
## v 
## 1 c 
## 2 b 
1

一個簡單的解決方法似乎是事先用withColumnRenamed函數重命名其中一個表中的列。我會嘗試的另一種方法是從列函數中找出位置,然後刪除列,但我沒有看到明顯有效的方法。

+0

沒有必要的變通方法。您可以簡單地在父數據框中使用'$'函數訪問列。 – zero323