从列创建垃圾箱的情况

时间:2020-03-18 08:34:16

标签: sql hive hiveql

我有一个表,其中一列(COL1)的值可以从0到1(包括1和2)。我想在此列中创建一个新列,该列使用预定义范围(即创建箱)对COL1进行分类。当类别/箱的数量较小时,可以使用CASE WHEN轻松完成,例如:

SELECT
       CASE WHEN COL1 <= 0.2 THEN 1
            WHEN COL1 > 0.2 AND COL1 <= 0.4 THEN 2
            ....
            WHEN COL1 > 0.8 AND COL1 <= 1 THEN 5
       END AS COL1_bin
FROM   Table

由于我想拥有100个垃圾箱,因此我正在寻找一种使用函数更“自动”执行此操作的方法,例如,我可以给出一个最小值,最大值和步进大小/垃圾箱大小(例如min = 0,最大值= 1,步长= 0.01)

我正在HiveQL中执行此操作,该功能与MySQL非常相似。

2 个答案:

答案 0 :(得分:2)

有一种方法可以做到这一点。如果假设您希望bin范围为0.1,0.2,0.3,...直到1。那么您将使用row_gen块并将step_size设置为row_number / 10,并通过将lower_limit和upper_limit设置为10来生成10行。每个垃圾箱。

之后,您需要检查col1的值是否适合于bin的相应上下边界,如下所示。 (我使用了左联接来包含col1值为null的那些条件。如果这种情况不太可能,那么可以将其更改为常规联接)

with row_gen 
  as (select top 10 
             ,row_number() over(order by 1) as bin_id
             ,row_number() over(order by 1)/10 as as lower_limit
             ,row_number() over(order by 1)/10 + 1/10 as as upper_limit
        from table /*any table that has 10 rows*/ 
      )
   select a.*
          ,b.bin_id
     from your_table a
left join row_gen b
       on a.col1 between b.lower_rnk and b.upper_rnk

答案 1 :(得分:1)

我不确定Hive是否具有装箱功能(Postgres具备)。但是您可以使用算术:

select floor( greatest(least($maxval, col1), $minval) - $minval) /
              $step_size
            ) as bin
from t;

如果要从数据中获取最小值和最大值,则可以使用窗口函数:

select floor( greatest(least(maxval, col1), minval) - minval) /
              $step_size
            ) as bin
from (select t.*,
             min(col1) over () as minval,
             max(col1) over () as maxval
      from t
     ) t;

严格来说,您不需要子查询即可进行计算。但这允许bin用于聚合。