是否可以在hive中执行“规范化”密集的\u rank()?

mnemlml8  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(461)

我有一张这样的消费桌。

  1. consumer | product | quantity
  2. -------- | ------- | --------
  3. a | x | 3
  4. a | y | 4
  5. a | z | 1
  6. b | x | 3
  7. b | y | 5
  8. c | x | 4

我想要的是一个“标准化”的排名分配给每个消费者,这样我就可以很容易地分割表进行测试和培训。我在hive中使用了dense_rank(),所以得到了下表。

  1. rank | consumer | product | quantity
  2. ---- | -------- | ------- | --------
  3. 1 | a | x | 3
  4. 1 | a | y | 4
  5. 1 | a | z | 1
  6. 2 | b | x | 3
  7. 2 | b | y | 5
  8. 3 | c | x | 4

这是很好的,但我想扩大这与任何数量的消费者使用,所以我希望理想的范围内排名之间的0和1,像这样。

  1. rank | consumer | product | quantity
  2. ---- | -------- | ------- | --------
  3. 0.33 | a | x | 3
  4. 0.33 | a | y | 4
  5. 0.33 | a | z | 1
  6. 0.67 | b | x | 3
  7. 0.67 | b | y | 5
  8. 1 | c | x | 4

这样,我总是知道等级的范围是什么,并且可以用标准的方法分割数据(等级<=0.7训练,等级>0.7测试)
有没有一种方法可以在Hive中实现这一点?
或者,有没有一种不同的更好的方法来解决我最初的数据分割问题?
我试着做一个 select * where rank < 0.7*max(rank) ,但是hive说maxudaf在where子句中还不可用。

brqmpdu1

brqmpdu11#

排名百分比

  1. select percent_rank() over (order by consumer) as pr
  2. ,*
  3. from mytable
  4. ;
  1. +-----+----------+---------+----------+
  2. | pr | consumer | product | quantity |
  3. +-----+----------+---------+----------+
  4. | 0.0 | a | z | 1 |
  5. | 0.0 | a | y | 4 |
  6. | 0.0 | a | x | 3 |
  7. | 0.6 | b | y | 5 |
  8. | 0.6 | b | x | 3 |
  9. | 1.0 | c | x | 4 |
  10. +-----+----------+---------+----------+

对于筛选,您需要一个子查询/cte

  1. select *
  2. from (select percent_rank() over (order by consumer) as pr
  3. ,*
  4. from mytable
  5. ) t
  6. where pr <= ...
  7. ;
展开查看全部

相关问题