在SparkR 1.5.0中,如何在公共列上加入后明确指定列?

时间:2015-09-30 09:51:17

标签: r apache-spark apache-spark-sql sparkr

我在一个名称相同的列上加入了两个数据帧。

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,...):
  org.apache.spark.sql.AnalysisException:引用'EmployeeID'是   不明确的,可能是:EmployeeID#36,EmployeeID#69 .;

2 个答案:

答案 0 :(得分: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 :(得分:1)

一个简单的解决方法似乎是事先使用withColumnRenamed函数重命名其中一个表中的列。我要尝试的另一种方法是从列函数中找出位置,然后删除列,但我没有看到明显有效的方法。