如何根据百分位数过滤表格,然后在 HQL 中随机抽样?

Posted

技术标签:

【中文标题】如何根据百分位数过滤表格,然后在 HQL 中随机抽样?【英文标题】:How to filter table based on percentile and then random sample in HQL? 【发布时间】:2018-05-08 15:53:06 【问题描述】:

我正在尝试从表中随机抽取 200 行,但首先我想过滤它以仅从变量中选择前 1% 的值。

我收到以下错误 -

编译语句时出错:FAILED: ParseException line 3:31 无法识别 'select' 'percentile_approx' '(' in 表达式规范

以下是我的查询-

> with sample_pop as (select * from
> mytable a where
> a.transaction_amount > (select
> percentile_approx(transaction_amount, 0.99) as top1
>                             from mytable) )
> 
> select * from sample_pop  distribute by rand(1) sort by rand(1) limit
> 200;

【问题讨论】:

【参考方案1】:

我不认为 Hive 以您使用它们的方式支持标量子查询(仅适用于 IN/EXISTS)。所以把逻辑移到FROM子句:

with sample_pop as (
      select *
      from mytable a cross join
           (select percentile_approx(transaction_amount, 0.99) as top1
            from mytable
           ) aa
      where a.transaction_amount > aa.top1
     )
select * 
from sample_pop distribute by rand(1) 
order by rand(1)
limit 200;

【讨论】:

谢谢戈登。这是有道理的,我试过你的查询,效果很好。感谢您的帮助!【参考方案2】:

通过以下查询解决了我的问题 -

with sample_pop as (select a.* from 
          (
          select *, cum_dist() over (order by transaction_amount asc) pct
          from mytable
          ) a
where pct >= 0.99
)
select * 
from sample_pop distribute by rand(1) 
order by rand(1)
limit 200;

【讨论】:

以上是关于如何根据百分位数过滤表格,然后在 HQL 中随机抽样?的主要内容,如果未能解决你的问题,请参考以下文章

区间估计 | 抽样分布抽来看——bootstrap法

根据 SQL 中的日期计算百分位数

根据百分位数绘制直方图

如何在 SQL 中设置滚动的 7 天第 75 个百分位数?

值计数的百分位数

如何在 C++/Rcpp 中进行快速百分位数计算