有没有办法在 presto 查询中应用循环

Posted

技术标签:

【中文标题】有没有办法在 presto 查询中应用循环【英文标题】:Is there any way to apply loop in a presto query 【发布时间】:2019-11-09 13:16:41 【问题描述】:

我的用例是使用表格顶部的以下 presto 视图通过将今天的值与昨天的值相减来获得每日计数。如果表中没有数据,则视图应动态考虑第二天的值,然后取缺失日视图的平均值。

这是一个 presto 查询。我在下面的查询中只取了一个字段

CREATE OR REPLACE VIEW hive.facebook.post_metrics_daily AS
SELECT
    a.post_id,
    a.page,
    a.dt,
    a.created_time,
    (
        COALESCE(
            (
                CAST(a.likes AS integer) 
                - IF(
                    (CAST(b.likes AS integer) IS NULL), 
                    0, 
                    CAST(b.likes AS integer)
                )
            )
            , 0
        )
    ) likes
FROM
    hive.facebook.post_metrics a                 
    LEFT JOIN hive.facebook.post_metrics b 
        ON  a.dt = (b.dt + INTERVAL  '+1' DAY)
        AND a.post_id = b.post_id 
        AND a.brandname = b.brandname
WHERE a.dt = date'2019-09-10'

如果数据是 9 日到 12 日的数据,而第 10 日的数据缺失,则视图应采用第 11 天的数据并取 9 日和 11 日的平均值以给出第 10 日的视图。如何做呢?这个公式可以在查询中应用吗?如果可以,那么如何?

(today-yesterday)/n+1 其中n 将是缺失的天数。

这是喜欢的示例数据。如果缺少喜欢,我需要平均喜欢,并且缺少的天数应该由查询动态识别..

 Date   Likes-org.  missing likes daily likes org.   expected likes
2019-10-17  20487   20487         20487                  20487
2019-10-18  25384   25384          4897                  4897
2019-10-19  26817   26817          1433                  1433
2019-10-20  27499   missing likes   682                   257
2019-10-21  27854   missing likes   355                   258
2019-10-22  27987   missing likes   133                   258
2019-10-23  28065   missing likes   78                    258
2019-10-24  28106   28106           41                    258
2019-10-25  28134   28134           28                     28

【问题讨论】:

请提供样本数据和期望的结果。 我已经更新了样本数据@gordon lag() 我猜想在行级别上工作。我需要根据可用日期的数据找到相同 id 的 diff 分区中的 diff 日期行之间的差异。 【参考方案1】:

我想你只是想要lag():

SELECT pm.*,
       (pm.likes +
        LAG(pm.likes) OVER (PARTITION BY pm.post_id, pm.brand_name ORDER BY pm.dt)
       ) / 2
FROM hive.facebook.post_metrics pm ;

如果您想将缺失的日期视为0s,则需要日期算术。我认为这是:

SELECT pm.*,
       ( (pm.likes +
          LAG(pm.likes) OVER (PARTITION BY pm.post_id, pm.brand_name ORDER BY pm.dt)
         ) /
         DATE_DIFF(day,
                   LAG(pm.dt) OVER (PARTITION BY pm.post_id, pm.brand_name ORDER BY pm.dt),
                   dt
                  )
       )
FROM hive.facebook.post_metrics pm ;

如果您希望在特定日期使用此信息,请使用子查询或上述表达式,然后在外部查询中进行过滤。

【讨论】:

我认为这不是我想要的实际溶胶。假设如果我为 21 日创建一个视图,那么该视图应该只返回我喜欢的 258。这就是我所期望的。

以上是关于有没有办法在 presto 查询中应用循环的主要内容,如果未能解决你的问题,请参考以下文章

带有presto的GCP dataproc - 有没有办法使用pyhive通过python远程运行查询?

Presto 和 hive 分区发现

#Word文档导入#大数据presto+Alluxio

有没有办法过滤 presto 数组中的奇数或偶数索引?

Presto Coordinator 不支持高可用性

Presto 在腾讯的应用