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 列的每个独特组合提取一行,包含所有列,例如 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;'"
请帮忙!
感谢您的时间和耐心。
【问题讨论】:
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章