2016-02-15 4 views
-1

Я стажер, работающий с большими данными, и это мой первый вопрос. Если я не прошу об этом, сообщите мне, как улучшить.SQL Hive: выберите (*) LIMIT 1 на основе комбинации из 3 столбцов, объединение в R, RODBC

У меня очень большая таблица, которую я просматриваю через Hive через RODBC-пакет R.

Предположим, что таблица имеет столбцы с именем A:ZZZ.

Я хотел бы, чтобы вытащить одну строку, со всеми столбцами, для каждой уникальной комбинации 3-х колонок, скажем B, F и G.

Я побежал ниже запрос, чтобы получить все уникальные комбинации B, F и G, и пришел с чуть более 7000:

select B, F, G, count(*) 
from DB.tableName 
group by B, F, G; 

Я сделал много исследований и обнаружил this:

SELECT * FROM T WHERE (A,B) IN (('1', '1'),('2', '2')); 

я в настоящее время есть все мои комбинации B, F и G хранится в виде кадра данных в R. Я подумал, что если я может преобразовать фрейм данных комбинаций в вектор, который я назвал TestVector, что я мог бы попробовать это:

SELECT * FROM DB.Table WHERE (B,F,G) IN TestVector LIMIT 1; 

, но я получаю эти ошибки, и не знаю, как исправить синтаксис:

[1] "HY000 110 [Cloudera][ImpalaODBC] (110) Error while executing a query in Impala: [HY000] : AnalysisException: Syntax error in line 5:\n    (B, F, G)\n     ^\nEncountered: COMMA\nExpected: AND, BETWEEN, DIV, IN, IS, LIKE, NOT, OR, REGEXP, RLIKE\n\nCAUSED BY: Exception: Syntax error\n" 
[2] "[RODBC] ERROR: Could not SQLExecDirect 'select *\n    from \n    DB.table \n    WHERE \n    (B, F, G)\n    IN (vectorTest)\n    LIMIT 1;'" 

Пожалуйста, помогите!

Спасибо за ваше время и терпение.

ответ

0

Я хотел бы, чтобы вытащить одну строку, со всеми столбцами, для каждого уникального сочетание 3-х колонок, скажем, B, F и G.

запросов, как это обычно решается с помощью row_number, чтобы перечислять каждую строку в группе и выбирать строки с определенным номером строки.

select * from (
    select * , 
    row_number() over (partition by B, F, G order by id) rn 
    from DB.tableName 
) t where rn = 1 

Запрос выше будет выбрать строку с наименьшим id для каждой группы B,F,G.