使用HiveContext选择除Spark中包含最小值的行

时间:2016-04-06 06:51:25

标签: sparkr hivecontext

我有一个Spark数据框,其中包含Timestamp和Machine ID。我希望从每个组中删除最低时间戳值。我尝试了以下代码:

sqlC <- sparkRHive.init(sc)
ts_df2<- sql(sqlC,"SELECT ts,Machine FROM sdf2 EXCEPT SELECT MIN(ts),Machine FROM sdf2 GROUP BY Machine")

但是会出现以下错误:

16/04/06 06:47:52 ERROR RBackendHandler: sql on 35 failed
Error in invokeJava(isStatic = FALSE, objId$id, methodName, ...) : 
org.apache.spark.sql.AnalysisException: missing EOF at 'SELECT' near 'EXCEPT'; line 1 pos 35

有什么问题?如果HiveContext不支持EXCEPT关键字,那么在HiveContext中这样做的同义方法是什么?

1 个答案:

答案 0 :(得分:1)

Spark 1.6.1的编程指南显示了Spark 1.6.1中支持和不支持的Hive功能 http://spark.apache.org/docs/latest/sql-programming-guide.html#supported-hive-features

我不会在任何一个类别中看到除外。我在其他地方看到Hive QL不支持EXCEPT,或者至少当时没有。 Hive QL Except clause

也许尝试一个分钟表,然后在答案中做左外连接?

SELECT ts, Machine FROM ts mins LEFT OUTER JOIN ts mins ON (ts.id=mins.id) WHERE mins.id IS NULL;

你也可以使用除了()之外的sparkR内置函数,虽然我认为你需要首先创建你的mins DataFrame

exceptDF <- except(df, df2)