1

我目前正在尝试在看起来像的表上运行请求

Key Desc1 Desc2 Val
1   Hello World 37
2   Alpha Beta  27
2   Gamma Kappa 28
1   Bjr   Mde   42

我的目标是按“键”分组并询问 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;

当我尝试执行查询时,在语法检查期间我没有任何错误,但配置单元只是挂起而没有创建任何作业。然后它失败并出现以下错误:

FAILED: SemanticException org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: Read timed out

我不知道失败的确切原因。您在我的查询中看到明显的错误吗? (如果是这样,它应该在语法检查期间失败;请注意,如果我在“col2”->“col3”这样的查询中引入错误,它会“正常”失败)

您知道我们是否可以强制 hive 显示有关错误的更多信息?我没有看到“详细”模式,但我可能错过了......

非常感谢你的帮助。

4

2 回答 2

2

这使用Hive 窗口函数相当简单。只需接管min()窗口,然后选择彼此相等的arg_minVal

查询

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
于 2015-10-23T20:27:32.150 回答
1

实际上,我的问题中提出的查询是正确且有效的(至少在 hive 0.10 中)。

这个问题是一个纯粹的“超时”问题,可以通过如下设置来解决:

set hive.metastore.client.socket.timeout=300;
于 2015-10-27T09:59:04.917 回答