我目前正在尝试在看起来像
的表上运行请求Key Desc1 Desc2 Val
1 Hello World 37
2 Alpha Beta 27
2 Gamma Kappa 28
1 Bjr Mde 42
我的目标是按照" Key"并询问Val = min(Vals)的行(在组中)。对于上面的虚拟表,我希望像
Key Desc1 Desc2 Val
1 Hello World 37
2 Alpha Beta 27
为此,我使用以下请求:
select Key
min(struct(Val,Desc1)).col2 as Desc1,
min(struct(Val,Desc2)).col2 as Desc2,
min(Val) as Val
from mytable;
当我尝试执行查询时,我在语法检查期间没有任何错误,但是hive只是在没有创建任何作业的情况下挂起。然后它失败并出现以下错误:
FAILED: SemanticException org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: Read timed out
我不知道失败的确切原因。你在我的查询中看到一个明显的错误吗? (如果是这样,它应该在语法检查期间失败;请注意它失败"通常"如果我在查询中引入错误,如" col2" - >&#34 ; COL3&#34)
您知道我们是否可以强制配置单元显示有关错误的更多信息?我没见过"详细"模式,但我可能错过了....
非常感谢你的帮助。
答案 0 :(得分:2)
使用Hive windowing functions这非常简单。只需在窗口上方min()
,然后选择arg_min
和Val
相等的行。
<强>查询强>:
select Key, Desc1, Desc2, arg_min
from (
select *
, min(Val) over (partition by key) as arg_min
from db.tbl ) x
where Val = arg_min
<强>输出强>:
1 Hello World 37
2 Alpha Beta 27
答案 1 :(得分:1)
实际上,我的问题中提出的查询是正确且有效的(至少在hive 0.10中)。
问题是纯粹的&#34;超时&#34;可以通过如下设置配置来解决的问题:
set hive.metastore.client.socket.timeout=300;