1

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

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 中执行相同操作的同义方式是什么?

4

1 回答 1

1

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

我在这两个类别中都没有看到 EXCEPT。我在其他地方看到 Hive QL 不支持 EXCEPT,或者至少当时不支持。 Hive QL 除外子句

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

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

您也可以使用 sparkR 内置函数 except(),但我认为您需要先创建 mins DataFrame

exceptDF <- except(df, df2)
于 2016-04-06T22:47:40.650 回答