【问题标题】:Hiveql aggregation :recurrence testsHiveql 聚合:递归测试
【发布时间】:2017-09-08 22:24:46
【问题描述】:

我正在使用 hive 和 hadoop。我正在寻找一个函数 (hiveql),它允许对匹配规则的客户列表进行排序。 我想在最后连续 10 天(colldate)进行条件测试。预期的结果是在过去 10 天内仅计算此条件的客户 (ressourcename) 的列表:success>=3。每个客户每天都记录一个条目(成功次数)。 我使用以下查询,但构建了许多 map reduce,这需要很多时间。 我正在寻找一种优化方法:

            select J1.colldate,J1.ResourceName
            from
            TABLE J1,
            TABLE J2,
            TABLE J3,
            TABLE J4,
            TABLE J5,
            TABLE J6,
            TABLE J7,
            TABLE J8,
            TABLE J9,
            TABLE J10
            WHERE
            J1.ResourceName=J2.ResourceName
            and J1.ResourceName=J3.ResourceName
            and J1.ResourceName=J4.ResourceName
            and J1.ResourceName=J5.ResourceName
            and J1.ResourceName=J6.ResourceName
            and J1.ResourceName=J7.ResourceName
            and J1.ResourceName=J8.ResourceName
            and J1.ResourceName=J9.ResourceName
            and J1.ResourceName=J10.ResourceName
            and J1.success>=3
            and J2.success>=3
            and J3.success>=3
            and J4.success>=3
            and J5.success>=3
            and J6.success>=3
            and J7.success>=3
            and J8.success>=3
            and J9.success>=3
            and J10.success>=3
            and J1.colldate=from_unixtime(unix_timestamp()-1*60*60*24, 'dd/MM/yyyy')
            and J2.colldate=from_unixtime(unix_timestamp()-2*60*60*24, 'dd/MM/yyyy')
            and J3.colldate=from_unixtime(unix_timestamp()-3*60*60*24, 'dd/MM/yyyy')
            and J4.colldate=from_unixtime(unix_timestamp()-4*60*60*24, 'dd/MM/yyyy')
            and J5.colldate=from_unixtime(unix_timestamp()-5*60*60*24, 'dd/MM/yyyy')
            and J6.colldate=from_unixtime(unix_timestamp()-6*60*60*24, 'dd/MM/yyyy')
            and J7.colldate=from_unixtime(unix_timestamp()-7*60*60*24, 'dd/MM/yyyy')
            and J8.colldate=from_unixtime(unix_timestamp()-8*60*60*24, 'dd/MM/yyyy')
            and J9.colldate=from_unixtime(unix_timestamp()-9*60*60*24, 'dd/MM/yyyy')
            and J10.colldate=from_unixtime(unix_timestamp()-10*60*60*24, 'dd/MM/yyyy');

表的结构是: enter image description here

【问题讨论】:

  • 添加一个包含源行集和请求行集的数据样本。

标签: aggregate-functions hiveql


【解决方案1】:

假设我们有一张这样的表,我在这里假设您每天都有一个记录:

+------------+----------+-------+
|ResourceName|  colldate|success|
+------------+----------+-------+
|           a|2017-01-01|     10|
|           a|2017-01-02|     14|
|           a|2017-01-03|      9|
|           a|2017-01-04|     12|
|           a|2017-01-05|      8|
|           a|2017-01-06|      7|
|           a|2017-01-07|     13|
|           a|2017-01-08|     11|
|           a|2017-01-09|      5|
|           a|2017-01-10|      2|
|           a|2017-01-11|     16|
|           a|2017-01-12|     10|
|           a|2017-01-13|      9|
|           a|2017-01-14|     17|
|           a|2017-01-15|     12|
|           a|2017-01-16|     10|
|           a|2017-01-17|     13|
|           a|2017-01-18|      7|
|           a|2017-01-19|      9|
|           a|2017-01-20|      3|
+------------+----------+-------+

您可以使用比 10 个连接更有效的窗口函数:

SELECT 
    *, 
    ( 
        sum(CAST(success >= 3 AS Int)) OVER ( 
            PARTITION BY ResourceName ORDER BY colldate ROWS BETWEEN 9 PRECEDING AND CURRENT ROW 
        ) 
    ) == 10 AS success_for_10days 
FROM J

+------------+----------+-------+------------------+
|ResourceName|  colldate|success|success_for_10days|
+------------+----------+-------+------------------+
|           a|2017-01-01|     10|             false|
|           a|2017-01-02|     14|             false|
|           a|2017-01-03|      9|             false|
|           a|2017-01-04|     12|             false|
|           a|2017-01-05|      8|             false|
|           a|2017-01-06|      7|             false|
|           a|2017-01-07|     13|             false|
|           a|2017-01-08|     11|             false|
|           a|2017-01-09|      5|             false|
|           a|2017-01-10|      2|             false|
|           a|2017-01-11|     16|             false|
|           a|2017-01-12|     10|             false|
|           a|2017-01-13|      9|             false|
|           a|2017-01-14|     17|             false|
|           a|2017-01-15|     12|             false|
|           a|2017-01-16|     10|             false|
|           a|2017-01-17|     13|             false|
|           a|2017-01-18|      7|             false|
|           a|2017-01-19|      9|             false|
|           a|2017-01-20|      3|              true|
+------------+----------+-------+------------------+

然后过滤success_for_10days

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 2014-03-01
    • 2014-04-09
    • 2014-03-23
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多