2016-04-06 2 views
1

У меня есть пакет данных Spark, содержащий метки времени и идентификаторы машины. Я хочу удалить самое низкое значение временной метки из каждой группы. Я попытался следующий код:Выберите строки, кроме тех, которые содержат значение min в Spark, используя HiveContext

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

Руководство по программированию для Спарк 1.6.1 показывает и неподдерживаемый Hive особенности в Спарк 1.6.1 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 встроенной функции, кроме(), хотя я думаю, что вы должны создать вам минуты DataFrame первого

exceptDF <- except(df, df2) 
+0

спасибо за тонной !! – ps30