Hive数据范围等级转换实现

由于 在hive中不能进行不等值连接,所以遇到诸如数据范围等级转换的问题就相对比较麻烦。
可以使用[case when then]进行转换处理,但数据涉及到要转换的等级太多,代码无疑会很长。本例是一个比较中和一点的方法,相应损失了一些性能。
1、等级转换的map表
CREATE TABLE `xxwuy_empval_grade_map`(
  `grade` bigint, 
  `empval` bigint)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES ( 
  'field.delim'='\t', 
  'line.delim'='\n', 
  'serialization.format'='\t') ;
LOAD DATA LOCAL INPATH '/home/hadoop/nisj/xx/wuyan/empval_grade_map.txt' OVERWRITE  INTO TABLE xxwuy_empval_grade_map;
2、map表数据展示
hive> select * from xxwuy_empval_grade_map ;
OK
1       0
2       80
3       240
4       560
5       1120
6       1920
7       3040
8       4800
9       6800
10      9600
11      11060
12      14700
13      18200
14      23100
15      28700
16      35000
17      42000
18      50400
19      59500
20      70000
21      75000
22      80400
23      91800
24      105000
25      110000
26      118000
27      125000
28      139500
29      155000
30      175000
31      200000
32      225000
33      250000
34      280000
35      315000
36      350000
37      385000
38      420000
39      460000
40      500000
41      570000
42      888000
43      1254000
44      1390000
45      1704000
46      2112000
47      2558400
48      2789600
49      2972000
50      3096000
51      3546000
52      4024800
53      4280600
54      4787200
55      5008000
56      5190000
57      5709000
58      5835200
59      5909800
60      6500000
61      6890000
62      7345000
63      7562500
64      8125000
65      8750000
66      9437500
67      10187500
68      11000000
69      11875000
70      12812500
71      13812500
72      14875000
73      16000000
74      17187500
75      18437500
76      19750000
77      21125000
78      22562500
79      23750000
80      25000000
81      26850000
82      28740250
83      30671250
84      32643500
85      34657500
86      36713750
87      38812750
88      40955000
89      43141000
90      50000000
91      53125000
92      57125000
93      62000000
94      67750000
95      74375000
96      81875000
97      90250000
98      99500000
99      109625000
100     125000000
Time taken: 0.047 seconds, Fetched: 100 row(s)
3、实现等级范围转换的代码
select /*+ MAPJOIN(a2) */
a1.uid,a1.his_empval,min(a2.empval) empval_threshold,min(a2.grade) grade
from xxwuy_history_empirical_value a1
join xxwuy_empval_grade_map a2
where a1.his_empval<=a2.empval
group by a1.uid,a1.his_empval
limit 300;

猜你喜欢

转载自blog.csdn.net/babyfish13/article/details/80569194