SQL Hive:选择 (*) LIMIT 1 基于 3 列的组合,R 中的联合,RODBC

Posted

技术标签:

【中文标题】SQL Hive:选择 (*) LIMIT 1 基于 3 列的组合,R 中的联合,RODBC【英文标题】:SQL Hive: select (*) LIMIT 1 based on a combination of 3 columns, union in R, RODBC 【发布时间】:2016-02-15 21:32:56 【问题描述】:

我是一名从事大数据工作的实习生,这是我的第一个问题。如果我问得不好,请告诉我如何改进。

我有一个非常大的表,我通过 R 的 RODBC 包通过 Hive 进行查询。

假设该表有名为A:ZZZ 的列。

我想为 3 列的每个独特组合提取一行,包含所有列,例如 BFG。

我运行以下查询以获取 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'));

我目前将 BFG 的所有组合作为数据框存储在 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;'" 

请帮忙!

感谢您的时间和耐心。

【问题讨论】:

【参考方案1】:

我想为每个唯一的内容提取一行,包含所有列 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

上面的查询将为每个B,F,G 组选择具有最低id 的行。

【讨论】:

以上是关于SQL Hive:选择 (*) LIMIT 1 基于 3 列的组合,R 中的联合,RODBC的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询语句中的 limit 与 offset

原创经验分享(15)spark sql limit实现原理

Hive SQL 参数与性能调优

Hive优化

在 Hive 中实现 Limit 查询

hive的优化