由于
在hive中不能进行不等值连接,所以遇到诸如数据范围等级转换的问题就相对比较麻烦。
可以使用[case when then]进行转换处理,但数据涉及到要转换的等级太多,代码无疑会很长。本例是一个比较中和一点的方法,相应损失了一些性能。
1、等级转换的map表
可以使用[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;