【问题标题】:Hive "argmin" failing without outputHive“argmin”失败而没有输出
【发布时间】:2016-01-23 06:51:38
【问题描述】:

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

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;

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

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

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

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

非常感谢您的帮助。

【问题讨论】:

    标签: hive verbose


    【解决方案1】:

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

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

    set hive.metastore.client.socket.timeout=300;
    

    【讨论】:

      【解决方案2】:

      使用Hive windowing functions 相当简单。只需将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
      

      【讨论】:

      • +1 对于这个使用窗口窗口的有用解决方案。但是请注意,这仅在 hive >0.11 中可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 2019-05-21
      • 2019-07-31
      • 1970-01-01
      • 2021-03-31
      相关资源
      最近更新 更多