Spark处理后的结果数据resultDataFrame可以有多种存储介质,比较常见是存储为文件、关系型数据库,非关系行数据库。
各种方式有各自的特点,对于海量数据而言,如果想要达到实时查询的目的,使用HBase作为存储的介质是非常不错的选择。
现需求是:Spark对Hive、mysql数据源进行处理,然后将resultDataFrame写入HBase,但是HBase和Spark不在用一个环境,即结果需要通过网络IO进行二次操作。所以此篇文章会采取某些手段来实现上述要求。
将DataFrame写入Hbase的两种方式:
通过关联Hive-HBase将结果数据导入HBase
通过生成HFile导入HBase
通过关联Hive-HBase将结果数据导入HBase
通过Hive-HBase将结果导入HBase也分两种情况
1.Hive为管理表
1.1 创建的hive管理表关联HBase
1 drop table table_hive_mange;
2 create table table_hive_mange
3 (key String,
4 dict_id String,
5 city_id String,
6 city_name String,
7 city_code String,
8 group_id String,
9 group_name String,
10 area_code String,
11 bureau_id String,
12 sort String,
13 bureau_name String)
14 row format delimited
15 fields terminated by '|'
16 STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
17 WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
18 info:dict_id,
19 info:city_id,
20 info:city_name,
21 info:city_code,
22 info:group_id,
23 info:group_name,
24 info:area_code,
25 info:bureau_id, info:sort,
26 info:bureau_name")
27 TBLPROPERTIES("hbase.table.name" = "table_hive_mange");
28
29 hive> drop table table_hive_mange;
30 OK
31 Time taken: 1.554 seconds
32 hive> create table table_hive_mange
33 > (key String,
34 > dict_id String,
35 > city_id String,
36 > city_name String,
37 > city_code String,
38 > group_id String,
39 > group_name String,
40 > area_code String,
41 > bureau_id String,
42 > sort String,
43 > bureau_name String)
44 > row format delimited
45 > fields terminated by '|'
46 > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
47 > WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
48 > info:dict_id,
49 > info:city_id,
50 > info:city_name,
51 > info:city_code,
52 > info:group_id,
53 > info:group_name,
54 > info:area_code,
55 > info:bureau_id, info:sort,
56 > info:bureau_name")
57 > TBLPROPERTIES("hbase.table.name" = "table_hive_mange");
58 OK
59 Time taken: 6.884 seconds
60
61 hive> desc formatted table_hive_mange;
62 OK
63 # col_name data_type comment
64
65 key string from deserializer
66 dict_id string from deserializer
67 city_id string from deserializer
68 city_name string from deserializer
69 city_code string from deserializer
70 group_id string from deserializer
71 group_name string from deserializer
72 area_code string from deserializer
73 bureau_id string from deserializer
74 sort string from deserializer
75 bureau_name string from deserializer
76
77 # Detailed Table Information
78 Database: default
79 Owner: hdfs
80 CreateTime: Tue Oct 16 16:23:22 CST 2018
81 LastAccessTime: UNKNOWN
82 Protect Mode: None
83 Retention: 0
84 Location: hdfs://ns1/user/hive/warehouse/table_hive_mange
85 Table Type: MANAGED_TABLE
86 Table Parameters:
87 hbase.table.name table_hive_mange
88 storage_handler org.apache.hadoop.hive.hbase.HBaseStorageHandler
89 transient_lastDdlTime 1539678202
90
91 # Storage Information
92 SerDe Library: org.apache.hadoop.hive.hbase.HBaseSerDe
93 InputFormat: null
94 OutputFormat: null
95 Compressed: No
96 Num Buckets: -1
97 Bucket Columns: []
98 Sort Columns: []
99 Storage Desc Params:
100 field.delim |
101 hbase.columns.mapping :key,\ninfo:dict_id,\ninfo:city_id,\ninfo:city_name,\ninfo:city_code,\ninfo:group_id,\ninfo:group_name,\ninfo:area_code,\ninfo:bureau_id, info:sort,\ninfo:bureau_name
102 serialization.format |
103 Time taken: 2.098 seconds, Fetched: 40 row(s)
104
105 //此时HBase表已经生成
106 hbase(main):001:0> desc 'table_hive_mange'
107 Table table_hive_mange is ENABLED
108 table_hive_mange
109 COLUMN FAMILIES DESCRIPTION
110 {NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE =>
111 '65536', REPLICATION_SCOPE => '0'}
112 1 row(s) in 0.3910 seconds
113
114 hbase(main):002:0>
1.2 创建普通的hive管理表
1 drop table table_hive_mange1;
2 create table table_hive_mange1
3 (key String,
4 dict_id String,
5 city_id String,
6 city_name String,
7 city_code String,
8 group_id String,
9 group_name String,
10 area_code String,
11 bureau_id String,
12 sort String,
13 bureau_name String)
14 row format delimited
15 fields terminated by '|'
16 STORED AS TEXTFILE;
17
18 hive> drop table table_hive_mange1;
19 OK
20 Time taken: 0.027 seconds
21 hive> create table table_hive_mange1
22 > (key String,
23 > dict_id String,
24 > city_id String,
25 > city_name String,
26 > city_code String,
27 > group_id String,
28 > group_name String,
29 > area_code String,
30 > bureau_id String,
31 > sort String,
32 > bureau_name String)
33 > row format delimited
34 > fields terminated by '|'
35 > STORED AS TEXTFILE;
36 OK
37 Time taken: 0.188 seconds
38 hive> desc formatted
39 > table_hive_mange1;
40 OK
41 # col_name data_type comment
42
43 key string
44 dict_id string
45 city_id string
46 city_name string
47 city_code string
48 group_id string
49 group_name string
50 area_code string
51 bureau_id string
52 sort string
53 bureau_name string
54
55 # Detailed Table Information
56 Database: default
57 Owner: hdfs
58 CreateTime: Tue Oct 16 16:24:41 CST 2018
59 LastAccessTime: UNKNOWN
60 Protect Mode: None
61 Retention: 0
62 Location: hdfs://ns1/user/hive/warehouse/table_hive_mange1
63 Table Type: MANAGED_TABLE
64 Table Parameters:
65 transient_lastDdlTime 1539678281
66
67 # Storage Information
68 SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
69 InputFormat: org.apache.hadoop.mapred.TextInputFormat
70 OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
71 Compressed: No
72 Num Buckets: -1
73 Bucket Columns: []
74 Sort Columns: []
75 Storage Desc Params:
76 field.delim |
77 serialization.format |
78 Time taken: 4.3 seconds, Fetched: 37 row(s)
1.3 准备一份数据
1 [hdfs@iptve2e03 tmp_lillcol]$ hadoop fs -cat hdfs://ns1/user/hive/warehouse//hive-hbase
2 736_9铜锣湾1|1|73629|铜锣湾1|啥子字段|110|艾欧尼亚大区|weq|76D5A3D3EA4|1|汉东省东中猴姑米西翻公司
3 475_铜锣湾2|13|4750|铜锣湾2|啥子字段|110|艾欧尼亚大区|weq|5F4E9不知C5|1|汉东省江中猴姑米西翻公司
4 765_铜锣湾3|3|7650|铜锣湾3|啥子字段|110|艾欧尼亚大区|weq|59B4B不知92|1|汉东省中中猴姑米西翻公司
5 667_铜锣湾4|14|6672|铜锣湾4|啥子字段|110|艾欧尼亚大区|weq|CF19F不知名B|21|汉东省阳中猴姑米西翻公司
6 758_铜锣湾5|4|7586|铜锣湾5|啥子字段|110|黑莓尼亚大区|weq|507EB不知78|1|汉东省珠中猴姑米西翻公司
7 796_铜锣湾6|15|7966|铜锣湾6|啥子字段|110|艾欧尼亚大区|weq|9C9C0不知名4|21|汉东省云中猴姑米西翻公司
8 754_8铜锣湾7|5|75468|铜锣湾7|啥子字段|110|艾欧尼亚大区|weq|5B736不知名F|11|汉东省潮中猴姑米西翻公司
9 706_铜锣湾8|16|7062|铜锣湾8|啥子字段|110|艾欧尼亚大区|weq|51A88不知名8|11|汉东省河中猴姑米西翻公司
10 754_铜锣湾9|6|7547|铜锣湾9|啥子字段|110|艾欧尼亚大区|weq|EEA9F不知59|1|汉东省佛中猴姑米西翻公司
11 626_铜锣湾0|17|6263|铜锣湾0|啥子字段|110|瑞本大区|weq|9FF783FEE9|11|汉东省揭中猴姑米西翻公司
12 754_铜锣湾-|7|7542|铜锣湾-|啥子字段|110|艾欧尼亚大区|weq|246A1不知FC|1|汉东省惠中猴姑米西翻公司
13 755_铜锣湾12|18|7553|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|E9BE9不知名9|11|汉东省梅中猴姑米西翻公司
14 661_铜锣湾12|8|6618|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|5D0A9不知名E|11|汉东省茂中猴姑米西翻公司
15 765_铜锣湾3|19|7651|铜锣湾3|啥子字段|110|德玛西亚尼亚大区|weq|BD6F不6379|11|汉东省韶中猴姑米西翻公司
16 754_铜锣湾32|9|7544|铜锣湾32|啥子字段|110|艾欧尼亚大区|weq|18D7A不知1E|1|汉东省汕中猴姑米西翻公司
17 375_铜锣湾234|20|3755|铜锣湾234|啥子字段|110|艾欧尼亚大区|weq|31E2F不知82|1|汉东省深中猴姑米西翻公司
18 626_0铜锣湾45|10|62630|铜锣湾45|啥子字段|110|艾欧尼亚大区|weq|1BA07不知名B|11|汉东省汕中猴姑米西翻公司
19 458铜锣湾99|21|458|铜锣湾99|啥子字段|110|艾欧尼亚大区|weq|3C09D不知名B|11|汉东省肇中猴姑米西翻公司
20 715铜锣湾12|11|715|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|3A49A不知名7|11|汉东省湛中猴姑米西翻公司
21 723_铜锣湾3|2|7231|铜锣湾3|啥子字段|110|台湾大区|weq|F8E9FCB7B1|11|汉东省清中猴姑米西翻公司
22 221_铜锣湾2|12|2210|铜锣湾2|啥子字段|110|韩国大区|weq|13F1D05894|1|汉东省广中猴姑米西翻公司
1.4 向 table_hive_mange1 中添加数据
1 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange1;
2 hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange1;
3 Loading data to table default.table_hive_mange1
4 Table default.table_hive_mange1 stats: [numFiles=1, totalSize=1947]
5 OK
6 Time taken: 0.402 seconds
7 hive>
1.5 查看 table_hive_mange1 中的数据
1 hive> select * from table_hive_mange1;
2 OK
3 736_9铜锣湾1 1 73629 铜锣湾1 啥子字段 110 艾欧尼亚大区 weq 76D5A3D3EA4 1 汉东省东中猴姑米西翻公司
4 475_铜锣湾2 13 4750 铜锣湾2 啥子字段 110 艾欧尼亚大区 weq 5F4E9不知C5 1 汉东省江中猴姑米西翻公司
5 765_铜锣湾3 3 7650 铜锣湾3 啥子字段 110 艾欧尼亚大区 weq 59B4B不知92 1 汉东省中中猴姑米西翻公司
6 667_铜锣湾4 14 6672 铜锣湾4 啥子字段 110 艾欧尼亚大区 weq CF19F不知名B 21 汉东省阳中猴姑米西翻公司
7 758_铜锣湾5 4 7586 铜锣湾5 啥子字段 110 黑莓尼亚大区 weq 507EB不知78 1 汉东省珠中猴姑米西翻公司
8 796_铜锣湾6 15 7966 铜锣湾6 啥子字段 110 艾欧尼亚大区 weq 9C9C0不知名4 21 汉东省云中猴姑米西翻公司
9 754_8铜锣湾7 5 75468 铜锣湾7 啥子字段 110 艾欧尼亚大区 weq 5B736不知名F 11 汉东省潮中猴姑米西翻公司
10 706_铜锣湾8 16 7062 铜锣湾8 啥子字段 110 艾欧尼亚大区 weq 51A88不知名8 11 汉东省河中猴姑米西翻公司
11 754_铜锣湾9 6 7547 铜锣湾9 啥子字段 110 艾欧尼亚大区 weq EEA9F不知59 1 汉东省佛中猴姑米西翻公司
12 626_铜锣湾0 17 6263 铜锣湾0 啥子字段 110 瑞本大区 weq 9FF783FEE9 11 汉东省揭中猴姑米西翻公司
13 754_铜锣湾- 7 7542 铜锣湾- 啥子字段 110 艾欧尼亚大区 weq 246A1不知FC 1 汉东省惠中猴姑米西翻公司
14 755_铜锣湾12 18 7553 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq E9BE9不知名9 11 汉东省梅中猴姑米西翻公司
15 661_铜锣湾12 8 6618 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 5D0A9不知名E 11 汉东省茂中猴姑米西翻公司
16 765_铜锣湾3 19 7651 铜锣湾3 啥子字段 110 德玛西亚尼亚大区 weq BD6F不6379 11 汉东省韶中猴姑米西翻公司
17 754_铜锣湾32 9 7544 铜锣湾32 啥子字段 110 艾欧尼亚大区 weq 18D7A不知1E 1 汉东省汕中猴姑米西翻公司
18 375_铜锣湾234 20 3755 铜锣湾234 啥子字段 110 艾欧尼亚大区 weq 31E2F不知82 1 汉东省深中猴姑米西翻公司
19 626_0铜锣湾45 10 62630 铜锣湾45 啥子字段 110 艾欧尼亚大区 weq 1BA07不知名B 11 汉东省汕中猴姑米西翻公司
20 458铜锣湾99 21 458 铜锣湾99 啥子字段 110 艾欧尼亚大区 weq 3C09D不知名B 11 汉东省肇中猴姑米西翻公司
21 715铜锣湾12 11 715 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 3A49A不知名7 11 汉东省湛中猴姑米西翻公司
22 723_铜锣湾3 2 7231 铜锣湾3 啥子字段 110 台湾大区 weq F8E9FCB7B1 11 汉东省清中猴姑米西翻公司
23 221_铜锣湾2 12 2210 铜锣湾2 啥子字段 110 韩国大区 weq 13F1D05894 1 汉东省广中猴姑米西翻公司
24 Time taken: 0.035 seconds, Fetched: 21 row(s)
25 hive>
1.6 将 table_hive_mange1 的数据插入 table_hive_mange
1 insert into table table_hive_mange select * from table_hive_mange1;
2
3 hive> insert into table table_hive_mange select * from table_hive_mange1;
4 Query ID = hdfs_20181016165252_4e5b605f-0351-4bd0-aa2e-0d9829694f6d
5 Total jobs = 1
6 Launching Job 1 out of 1
7 Number of reduce tasks is set to 0 since there s no reduce operator
8 Starting Job = job_1519375199907_258533, Tracking URL = http://iptve2e01:8088/proxy/application_1519375199907_258533/
9 Kill Command = /opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop/bin/hadoop job -kill job_1519375199907_258533
10 Hadoop job information for Stage-0: number of mappers: 1; number of reducers: 0
11 2018-10-16 16:53:46,259 Stage-0 map = 0%, reduce = 0%
12 2018-10-16 16:54:06,773 Stage-0 map = 100%, reduce = 0%, Cumulative CPU 6.65 sec
13 MapReduce Total cumulative CPU time: 6 seconds 650 msec
14 Ended Job = job_1519375199907_258533
15 MapReduce Jobs Launched:
16 Stage-Stage-0: Map: 1 Cumulative CPU: 6.65 sec HDFS Read: 7381 HDFS Write: 0 SUCCESS
17 Total MapReduce CPU Time Spent: 6 seconds 650 msec
18 OK
19 Time taken: 89.331 seconds
1.7 查看table_hive_mange 中的数据
1 hive> select * from table_hive_mange 中的数据;
2 OK
3 221_铜锣湾2 12 2210 铜锣湾2 啥子字段 110 韩国大区 weq 13F1D05894 1 汉东省广中猴姑米西翻公司
4 375_铜锣湾234 20 3755 铜锣湾234 啥子字段 110 艾欧尼亚大区 weq 31E2F不知82 1 汉东省深中猴姑米西翻公司
5 458铜锣湾99 21 458 铜锣湾99 啥子字段 110 艾欧尼亚大区 weq 3C09D不知名B 11 汉东省肇中猴姑米西翻公司
6 475_铜锣湾2 13 4750 铜锣湾2 啥子字段 110 艾欧尼亚大区 weq 5F4E9不知C5 1 汉东省江中猴姑米西翻公司
7 626_0铜锣湾45 10 62630 铜锣湾45 啥子字段 110 艾欧尼亚大区 weq 1BA07不知名B 11 汉东省汕中猴姑米西翻公司
8 626_铜锣湾0 17 6263 铜锣湾0 啥子字段 110 瑞本大区 weq 9FF783FEE9 11 汉东省揭中猴姑米西翻公司
9 661_铜锣湾12 8 6618 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 5D0A9不知名E 11 汉东省茂中猴姑米西翻公司
10 667_铜锣湾4 14 6672 铜锣湾4 啥子字段 110 艾欧尼亚大区 weq CF19F不知名B 21 汉东省阳中猴姑米西翻公司
11 706_铜锣湾8 16 7062 铜锣湾8 啥子字段 110 艾欧尼亚大区 weq 51A88不知名8 11 汉东省河中猴姑米西翻公司
12 715铜锣湾12 11 715 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 3A49A不知名7 11 汉东省湛中猴姑米西翻公司
13 723_铜锣湾3 2 7231 铜锣湾3 啥子字段 110 台湾大区 weq F8E9FCB7B1 11 汉东省清中猴姑米西翻公司
14 736_9铜锣湾1 1 73629 铜锣湾1 啥子字段 110 艾欧尼亚大区 weq 76D5A3D3EA4 1 汉东省东中猴姑米西翻公司
15 754_8铜锣湾7 5 75468 铜锣湾7 啥子字段 110 艾欧尼亚大区 weq 5B736不知名F 11 汉东省潮中猴姑米西翻公司
16 754_铜锣湾- 7 7542 铜锣湾- 啥子字段 110 艾欧尼亚大区 weq 246A1不知FC 1 汉东省惠中猴姑米西翻公司
17 754_铜锣湾32 9 7544 铜锣湾32 啥子字段 110 艾欧尼亚大区 weq 18D7A不知1E 1 汉东省汕中猴姑米西翻公司
18 754_铜锣湾9 6 7547 铜锣湾9 啥子字段 110 艾欧尼亚大区 weq EEA9F不知59 1 汉东省佛中猴姑米西翻公司
19 755_铜锣湾12 18 7553 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq E9BE9不知名9 11 汉东省梅中猴姑米西翻公司
20 758_铜锣湾5 4 7586 铜锣湾5 啥子字段 110 黑莓尼亚大区 weq 507EB不知78 1 汉东省珠中猴姑米西翻公司
21 765_铜锣湾3 19 7651 铜锣湾3 啥子字段 110 德玛西亚尼亚大区 weq BD6F不6379 11 汉东省韶中猴姑米西翻公司
22 796_铜锣湾6 15 7966 铜锣湾6 啥子字段 110 艾欧尼亚大区 weq 9C9C0不知名4 21 汉东省云中猴姑米西翻公司
23 Time taken: 0.29 seconds, Fetched: 20 row(s)
24 hive>
1.8 查看HBase中 table_hive_mange 的数据
1 hbase(main):008:0> scan 'table_hive_mange',{LIMIT=>2}
2 ROW COLUMN+CELL
3 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:area_code, timestamp=1539680045751, value=weq
4 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:bureau_id, timestamp=1539680045751, value=13F1D05894
5 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:bureau_name, timestamp=1539680045751, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE5\xB9\xBF\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
6 \xE5\x85\xAC\xE5\x8F\xB8
7 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_code, timestamp=1539680045751, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5
8 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_id, timestamp=1539680045751, value=2210
9 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_name, timestamp=1539680045751, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2
10 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:dict_id, timestamp=1539680045751, value=12
11 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:group_id, timestamp=1539680045751, value=110
12 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:group_name, timestamp=1539680045751, value=\xE9\x9F\xA9\xE5\x9B\xBD\xE5\xA4\xA7\xE5\x8C\xBA
13 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:sort, timestamp=1539680045751, value=1
14 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:area_code, timestamp=1539680045751, value=weq
15 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:bureau_id, timestamp=1539680045751, value=31E2F\xE4\xB8\x8D\xE7\x9F\xA582
16 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:bureau_name, timestamp=1539680045751, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE6\xB7\xB1\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
17 \xE5\x85\xAC\xE5\x8F\xB8
18 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_code, timestamp=1539680045751, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5
19 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_id, timestamp=1539680045751, value=3755
20 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_name, timestamp=1539680045751, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234
21 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:dict_id, timestamp=1539680045751, value=20
22 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:group_id, timestamp=1539680045751, value=110
23 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:group_name, timestamp=1539680045751, value=\xE8\x89\xBE\xE6\xAC\xA7\xE5\xB0\xBC\xE4\xBA\x9A\xE5\xA4\xA7\xE5\x8C\xBA
24 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:sort, timestamp=1539680045751, value=1
25 2 row(s) in 0.0140 seconds
26
27 hbase(main):009:0>
1.9 删除表
1 先删除hbase(disabled->drop)
2
3 hbase(main):009:0> disable 'table_hive_mange'
4 0 row(s) in 2.2700 seconds
5
6 hbase(main):010:0> drop 'table_hive_mange'
7 0 row(s) in 1.2290 seconds
8
9 hive> show tables;
10 OK
11 frt_user_auth_log1
12 table_hive_mange
13 table_hive_mange1
14 Time taken: 0.116 seconds, Fetched: 8 row(s)
15 hive> select * from table_hive_mange;
16 OK
17 Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange
18 Time taken: 0.245 seconds
19 hive> select * from table_hive_mange;
20 OK
21 Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange
22 Time taken: 0.148 seconds
23 hive> show tables;
24 OK
25 table_hive_mange
26 table_hive_mange1
27 Time taken: 0.01 seconds, Fetched: 8 row(s)
28 hive> select * from table_hive_mange;
29 OK
30 Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange
31 Time taken: 0.09 seconds
32 hive> drop table table_hive_mange;
33 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange
34 at org.apache.hadoop.hbase.client.HBaseAdmin.checkTableExistence(HBaseAdmin.java:1466)
35 at org.apache.hadoop.hbase.client.HBaseAdmin.isTableEnabled(HBaseAdmin.java:1477)
36 at org.apache.hadoop.hbase.client.HBaseAdmin.isTableEnabled(HBaseAdmin.java:1486)
37 ...
38 )
39 hive> show tables;
40 OK
41 table_hive_mange1
42 Time taken: 0.009 seconds, Fetched: 7 row(s)
43
44 //先删除Hive表
45 hive> drop table table_hive_mange;
46 OK
47 Time taken: 6.604 seconds
48
49 hbase(main):032:0> scan 'table_hive_mange',{LIMIT=>2}
50 ROW COLUMN+CELL
51
52 ERROR: Unknown table table_hive_mange!
53
54 hbase(main):033:0> list
2.Hive为外部表
2.1 创建 Hbase 表 table_hive_xternal
1 create 'table_hive_xternal','info'
2
3 hbase(main):012:0> create 'table_hive_xternal','info'
4 0 row(s) in 1.2450 seconds
5
6 => Hbase::Table - table_hive_xternal
7 hbase(main):013:0>
2.2 建立外部表(hive),关联存在hbase表
1 drop table table_hive_xternal;
2 create external table table_hive_xternal
3 (key String,
4 dict_id String,
5 city_id String,
6 city_name String,
7 city_code String,
8 group_id String,
9 group_name String,
10 area_code String,
11 bureau_id String,
12 sort String,
13 bureau_name String)
14 row format delimited
15 fields terminated by '|'
16 STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
17 WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
18 info:dict_id,
19 info:city_id,
20 info:city_name,
21 info:city_code,
22 info:group_id,
23 info:group_name,
24 info:area_code,
25 info:bureau_id,
26 info:sort,
27 info:bureau_name")
28 TBLPROPERTIES("hbase.table.name" = "table_hive_xternal");
1 hive> create external table table_hive_xternal
2 > (key String,
3 > dict_id String,
4 > city_id String,
5 > city_name String,
6 > city_code String,
7 > group_id String,
8 > group_name String,
9 > area_code String,
10 > bureau_id String,
11 > sort String,
12 > bureau_name String)
13 > row format delimited
14 > fields terminated by '|'
15 > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
16 > WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
17 > info:dict_id,
18 > info:city_id,
19 > info:city_name,
20 > info:city_code,
21 > info:group_id,
22 > info:group_name,
23 > info:area_code,
24 > info:bureau_id,
25 > info:sort,
26 > info:bureau_name")
27 > TBLPROPERTIES("hbase.table.name" = "table_hive_xternal");
28 OK
29 Time taken: 0.092 seconds
30
31 hive> desc formatted table_hive_xternal;
32 OK
33 # col_name data_type comment
34
35 key string from deserializer
36 dict_id string from deserializer
37 city_id string from deserializer
38 city_name string from deserializer
39 city_code string from deserializer
40 group_id string from deserializer
41 group_name string from deserializer
42 area_code string from deserializer
43 bureau_id string from deserializer
44 sort string from deserializer
45 bureau_name string from deserializer
46
47 # Detailed Table Information
48 Database: default
49 Owner: hdfs
50 CreateTime: Tue Oct 16 17:20:26 CST 2018
51 LastAccessTime: UNKNOWN
52 Protect Mode: None
53 Retention: 0
54 Location: hdfs://ns1/user/hive/warehouse/table_hive_xternal
55 Table Type: EXTERNAL_TABLE
56 Table Parameters:
57 EXTERNAL TRUE
58 hbase.table.name table_hive_xternal
59 storage_handler org.apache.hadoop.hive.hbase.HBaseStorageHandler
60 transient_lastDdlTime 1539681626
61
62 # Storage Information
63 SerDe Library: org.apache.hadoop.hive.hbase.HBaseSerDe
64 InputFormat: null
65 OutputFormat: null
66 Compressed: No
67 Num Buckets: -1
68 Bucket Columns: []
69 Sort Columns: []
70 Storage Desc Params:
71 field.delim |
72 hbase.columns.mapping :key,\n info:dict_id,\n info:city_id,\n info:city_name,\n info:city_code,\n info:group_id,\n info:group_name,\n info:area_code,\n info:bureau_id,\n info:sort,\n info:bureau_name
73 serialization.format |
74 Time taken: 0.882 seconds, Fetched: 41 row(s)
2.3创建普通的 hive 管理表
1 drop table table_hive_xternal_1;
2 create table table_hive_xternal_1
3 (key String,
4 dict_id String,
5 city_id String,
6 city_name String,
7 city_code String,
8 group_id String,
9 group_name String,
10 area_code String,
11 bureau_id String,
12 sort String,
13 bureau_name String)
14 row format delimited
15 fields terminated by '|'
16 STORED AS TEXTFILE;
1 hive> desc formatted table_hive_xternal_1;
2 OK
3 # col_name data_type comment
4
5 key string
6 dict_id string
7 city_id string
8 city_name string
9 city_code string
10 group_id string
11 group_name string
12 area_code string
13 bureau_id string
14 sort string
15 bureau_name string
16
17 # Detailed Table Information
18 Database: default
19 Owner: hdfs
20 CreateTime: Tue Oct 16 17:21:05 CST 2018
21 LastAccessTime: UNKNOWN
22 Protect Mode: None
23 Retention: 0
24 Location: hdfs://ns1/user/hive/warehouse/table_hive_xternal_1
25 Table Type: MANAGED_TABLE
26 Table Parameters:
27 transient_lastDdlTime 1539681665
28
29 # Storage Information
30 SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
31 InputFormat: org.apache.hadoop.mapred.TextInputFormat
32 OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
33 Compressed: No
34 Num Buckets: -1
35 Bucket Columns: []
36 Sort Columns: []
37 Storage Desc Params:
38 field.delim |
39 serialization.format |
40 Time taken: 0.033 seconds, Fetched: 37 row(s)
2.4 准备一份数据
1 [hdfs@iptve2e03 tmp_lillcol]$ hadoop fs -cat hdfs://ns1/user/hive/warehouse/hive-hbase
2 736_9铜锣湾1|1|73629|铜锣湾1|啥子字段|110|艾欧尼亚大区|weq|76D5A3D3EA4|1|汉东省东中猴姑米西翻公司
3 475_铜锣湾2|13|4750|铜锣湾2|啥子字段|110|艾欧尼亚大区|weq|5F4E9不知C5|1|汉东省江中猴姑米西翻公司
4 765_铜锣湾3|3|7650|铜锣湾3|啥子字段|110|艾欧尼亚大区|weq|59B4B不知92|1|汉东省中中猴姑米西翻公司
5 667_铜锣湾4|14|6672|铜锣湾4|啥子字段|110|艾欧尼亚大区|weq|CF19F不知名B|21|汉东省阳中猴姑米西翻公司
6 758_铜锣湾5|4|7586|铜锣湾5|啥子字段|110|黑莓尼亚大区|weq|507EB不知78|1|汉东省珠中猴姑米西翻公司
7 796_铜锣湾6|15|7966|铜锣湾6|啥子字段|110|艾欧尼亚大区|weq|9C9C0不知名4|21|汉东省云中猴姑米西翻公司
8 754_8铜锣湾7|5|75468|铜锣湾7|啥子字段|110|艾欧尼亚大区|weq|5B736不知名F|11|汉东省潮中猴姑米西翻公司
9 706_铜锣湾8|16|7062|铜锣湾8|啥子字段|110|艾欧尼亚大区|weq|51A88不知名8|11|汉东省河中猴姑米西翻公司
10 754_铜锣湾9|6|7547|铜锣湾9|啥子字段|110|艾欧尼亚大区|weq|EEA9F不知59|1|汉东省佛中猴姑米西翻公司
11 626_铜锣湾0|17|6263|铜锣湾0|啥子字段|110|瑞本大区|weq|9FF783FEE9|11|汉东省揭中猴姑米西翻公司
12 754_铜锣湾-|7|7542|铜锣湾-|啥子字段|110|艾欧尼亚大区|weq|246A1不知FC|1|汉东省惠中猴姑米西翻公司
13 755_铜锣湾12|18|7553|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|E9BE9不知名9|11|汉东省梅中猴姑米西翻公司
14 661_铜锣湾12|8|6618|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|5D0A9不知名E|11|汉东省茂中猴姑米西翻公司
15 765_铜锣湾3|19|7651|铜锣湾3|啥子字段|110|德玛西亚尼亚大区|weq|BD6F不6379|11|汉东省韶中猴姑米西翻公司
16 754_铜锣湾32|9|7544|铜锣湾32|啥子字段|110|艾欧尼亚大区|weq|18D7A不知1E|1|汉东省汕中猴姑米西翻公司
17 375_铜锣湾234|20|3755|铜锣湾234|啥子字段|110|艾欧尼亚大区|weq|31E2F不知82|1|汉东省深中猴姑米西翻公司
18 626_0铜锣湾45|10|62630|铜锣湾45|啥子字段|110|艾欧尼亚大区|weq|1BA07不知名B|11|汉东省汕中猴姑米西翻公司
19 458铜锣湾99|21|458|铜锣湾99|啥子字段|110|艾欧尼亚大区|weq|3C09D不知名B|11|汉东省肇中猴姑米西翻公司
20 715铜锣湾12|11|715|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|3A49A不知名7|11|汉东省湛中猴姑米西翻公司
21 723_铜锣湾3|2|7231|铜锣湾3|啥子字段|110|台湾大区|weq|F8E9FCB7B1|11|汉东省清中猴姑米西翻公司
22 221_铜锣湾2|12|2210|铜锣湾2|啥子字段|110|韩国大区|weq|13F1D05894|1|汉东省广中猴姑米西翻公司
2.5 向 table_hive_xternal_1 中添加数据
1 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal_1;
2 hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal_1;
3 Loading data to table default.table_hive_xternal_1
4 Table default.table_hive_xternal_1 stats: [numFiles=1, totalSize=2681]
5 OK
6 Time taken: 0.534 seconds
2.6 查看 table_hive_xternal_1 中的数据
1 hive> select * from table_hive_xternal_1;
2 OK
3 736_9铜锣湾1 1 73629 铜锣湾1 啥子字段 110 艾欧尼亚大区 weq 76D5A3D3EA4 1 汉东省东中猴姑米西翻公司
4 475_铜锣湾2 13 4750 铜锣湾2 啥子字段 110 艾欧尼亚大区 weq 5F4E9不知C5 1 汉东省江中猴姑米西翻公司
5 765_铜锣湾3 3 7650 铜锣湾3 啥子字段 110 艾欧尼亚大区 weq 59B4B不知92 1 汉东省中中猴姑米西翻公司
6 667_铜锣湾4 14 6672 铜锣湾4 啥子字段 110 艾欧尼亚大区 weq CF19F不知名B 21 汉东省阳中猴姑米西翻公司
7 758_铜锣湾5 4 7586 铜锣湾5 啥子字段 110 黑莓尼亚大区 weq 507EB不知78 1 汉东省珠中猴姑米西翻公司
8 796_铜锣湾6 15 7966 铜锣湾6 啥子字段 110 艾欧尼亚大区 weq 9C9C0不知名4 21 汉东省云中猴姑米西翻公司
9 754_8铜锣湾7 5 75468 铜锣湾7 啥子字段 110 艾欧尼亚大区 weq 5B736不知名F 11 汉东省潮中猴姑米西翻公司
10 706_铜锣湾8 16 7062 铜锣湾8 啥子字段 110 艾欧尼亚大区 weq 51A88不知名8 11 汉东省河中猴姑米西翻公司
11 754_铜锣湾9 6 7547 铜锣湾9 啥子字段 110 艾欧尼亚大区 weq EEA9F不知59 1 汉东省佛中猴姑米西翻公司
12 626_铜锣湾0 17 6263 铜锣湾0 啥子字段 110 瑞本大区 weq 9FF783FEE9 11 汉东省揭中猴姑米西翻公司
13 754_铜锣湾- 7 7542 铜锣湾- 啥子字段 110 艾欧尼亚大区 weq 246A1不知FC 1 汉东省惠中猴姑米西翻公司
14 755_铜锣湾12 18 7553 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq E9BE9不知名9 11 汉东省梅中猴姑米西翻公司
15 661_铜锣湾12 8 6618 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 5D0A9不知名E 11 汉东省茂中猴姑米西翻公司
16 765_铜锣湾3 19 7651 铜锣湾3 啥子字段 110 德玛西亚尼亚大区 weq BD6F不6379 11 汉东省韶中猴姑米西翻公司
17 754_铜锣湾32 9 7544 铜锣湾32 啥子字段 110 艾欧尼亚大区 weq 18D7A不知1E 1 汉东省汕中猴姑米西翻公司
18 375_铜锣湾234 20 3755 铜锣湾234 啥子字段 110 艾欧尼亚大区 weq 31E2F不知82 1 汉东省深中猴姑米西翻公司
19 626_0铜锣湾45 10 62630 铜锣湾45 啥子字段 110 艾欧尼亚大区 weq 1BA07不知名B 11 汉东省汕中猴姑米西翻公司
20 458铜锣湾99 21 458 铜锣湾99 啥子字段 110 艾欧尼亚大区 weq 3C09D不知名B 11 汉东省肇中猴姑米西翻公司
21 715铜锣湾12 11 715 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 3A49A不知名7 11 汉东省湛中猴姑米西翻公司
22 723_铜锣湾3 2 7231 铜锣湾3 啥子字段 110 台湾大区 weq F8E9FCB7B1 11 汉东省清中猴姑米西翻公司
23 221_铜锣湾2 12 2210 铜锣湾2 啥子字段 110 韩国大区 weq 13F1D05894 1 汉东省广中猴姑米西翻公司
24 Time taken: 0.036 seconds, Fetched: 21 row(s)
2.7 将table_hive_xternal_1 的数据插入 table_hive_xternal
1 insert into table table_hive_xternal select * from table_hive_xternal_1;
2 hive> insert into table table_hive_xternal select * from table_hive_xternal_1;
3 Query ID = hdfs_20181016172323_aad773d7-444f-431c-b0a2-917756ec965f
4 Total jobs = 1
5 Launching Job 1 out of 1
6 Number of reduce tasks is set to 0 since there's no reduce operator
7 Starting Job = job_1519375199907_258597, Tracking URL = http://127.0.0.1:8088/proxy/application_1519375199907_258597/
8 Kill Command = /opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop/bin/hadoop job -kill job_1519375199907_258597
9 Hadoop job information for Stage-0: number of mappers: 1; number of reducers: 0
10 2018-10-16 17:23:57,040 Stage-0 map = 0%, reduce = 0%
11 2018-10-16 17:24:03,215 Stage-0 map = 100%, reduce = 0%, Cumulative CPU 4.31 sec
12 MapReduce Total cumulative CPU time: 4 seconds 310 msec
13 Ended Job = job_1519375199907_258597
14 MapReduce Jobs Launched:
15 Stage-Stage-0: Map: 1 Cumulative CPU: 4.31 sec HDFS Read: 7472 HDFS Write: 0 SUCCESS
16 Total MapReduce CPU Time Spent: 4 seconds 310 msec
17 OK
18 Time taken: 13.523 seconds
2.8 查看 table_hive_xternal 的数据
1 select * from table_hive_xternal;
2
3 hive> select * from table_hive_xternal;
4 OK
5 221_铜锣湾2 12 2210 铜锣湾2 啥子字段 110 韩国大区 weq 13F1D05894 1 汉东省广中猴姑米西翻公司
6 375_铜锣湾234 20 3755 铜锣湾234 啥子字段 110 艾欧尼亚大区 weq 31E2F不知82 1 汉东省深中猴姑米西翻公司
7 458铜锣湾99 21 458 铜锣湾99 啥子字段 110 艾欧尼亚大区 weq 3C09D不知名B 11 汉东省肇中猴姑米西翻公司
8 475_铜锣湾2 13 4750 铜锣湾2 啥子字段 110 艾欧尼亚大区 weq 5F4E9不知C5 1 汉东省江中猴姑米西翻公司
9 626_0铜锣湾45 10 62630 铜锣湾45 啥子字段 110 艾欧尼亚大区 weq 1BA07不知名B 11 汉东省汕中猴姑米西翻公司
10 626_铜锣湾0 17 6263 铜锣湾0 啥子字段 110 瑞本大区 weq 9FF783FEE9 11 汉东省揭中猴姑米西翻公司
11 661_铜锣湾12 8 6618 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 5D0A9不知名E 11 汉东省茂中猴姑米西翻公司
12 667_铜锣湾4 14 6672 铜锣湾4 啥子字段 110 艾欧尼亚大区 weq CF19F不知名B 21 汉东省阳中猴姑米西翻公司
13 706_铜锣湾8 16 7062 铜锣湾8 啥子字段 110 艾欧尼亚大区 weq 51A88不知名8 11 汉东省河中猴姑米西翻公司
14 715铜锣湾12 11 715 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 3A49A不知名7 11 汉东省湛中猴姑米西翻公司
15 723_铜锣湾3 2 7231 铜锣湾3 啥子字段 110 台湾大区 weq F8E9FCB7B1 11 汉东省清中猴姑米西翻公司
16 736_9铜锣湾1 1 73629 铜锣湾1 啥子字段 110 艾欧尼亚大区 weq 76D5A3D3EA4 1 汉东省东中猴姑米西翻公司
17 754_8铜锣湾7 5 75468 铜锣湾7 啥子字段 110 艾欧尼亚大区 weq 5B736不知名F 11 汉东省潮中猴姑米西翻公司
18 754_铜锣湾- 7 7542 铜锣湾- 啥子字段 110 艾欧尼亚大区 weq 246A1不知FC 1 汉东省惠中猴姑米西翻公司
19 754_铜锣湾32 9 7544 铜锣湾32 啥子字段 110 艾欧尼亚大区 weq 18D7A不知1E 1 汉东省汕中猴姑米西翻公司
20 754_铜锣湾9 6 7547 铜锣湾9 啥子字段 110 艾欧尼亚大区 weq EEA9F不知59 1 汉东省佛中猴姑米西翻公司
21 755_铜锣湾12 18 7553 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq E9BE9不知名9 11 汉东省梅中猴姑米西翻公司
22 758_铜锣湾5 4 7586 铜锣湾5 啥子字段 110 黑莓尼亚大区 weq 507EB不知78 1 汉东省珠中猴姑米西翻公司
23 765_铜锣湾3 19 7651 铜锣湾3 啥子字段 110 德玛西亚尼亚大区 weq BD6F不6379 11 汉东省韶中猴姑米西翻公司
24 796_铜锣湾6 15 7966 铜锣湾6 啥子字段 110 艾欧尼亚大区 weq 9C9C0不知名4 21 汉东省云中猴姑米西翻公司
25 Time taken: 0.089 seconds, Fetched: 20 row(s)
2.9 查看HBase中 table_hive_xternal 的数据
1 scan 'table_hive_xternal',{LIMIT=>2}
2 hbase(main):013:0> scan 'table_hive_xternal',{LIMIT=>2}
3 ROW COLUMN+CELL
4 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:area_code, timestamp=1539681842885, value=weq
5 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:bureau_id, timestamp=1539681842885, value=13F1D05894
6 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:bureau_name, timestamp=1539681842885, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE5\xB9\xBF\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
7 \xE5\x85\xAC\xE5\x8F\xB8
8 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_code, timestamp=1539681842885, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5
9 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_id, timestamp=1539681842885, value=2210
10 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_name, timestamp=1539681842885, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2
11 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:dict_id, timestamp=1539681842885, value=12
12 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:group_id, timestamp=1539681842885, value=110
13 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:group_name, timestamp=1539681842885, value=\xE9\x9F\xA9\xE5\x9B\xBD\xE5\xA4\xA7\xE5\x8C\xBA
14 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:sort, timestamp=1539681842885, value=1
15 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:area_code, timestamp=1539681842885, value=weq
16 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:bureau_id, timestamp=1539681842885, value=31E2F\xE4\xB8\x8D\xE7\x9F\xA582
17 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:bureau_name, timestamp=1539681842885, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE6\xB7\xB1\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
18 \xE5\x85\xAC\xE5\x8F\xB8
19 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_code, timestamp=1539681842885, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5
20 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_id, timestamp=1539681842885, value=3755
21 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_name, timestamp=1539681842885, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234
22 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:dict_id, timestamp=1539681842885, value=20
23 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:group_id, timestamp=1539681842885, value=110
24 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:group_name, timestamp=1539681842885, value=\xE8\x89\xBE\xE6\xAC\xA7\xE5\xB0\xBC\xE4\xBA\x9A\xE5\xA4\xA7\xE5\x8C\xBA
25 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:sort, timestamp=1539681842885, value=1
26 2 row(s) in 0.0260 seconds
2.10 删除表
先删除hive表再查询Hbase
1 //删除hive表
2 hive> show tables ;
3 OK
4 table_hive_xternal
5 table_hive_xternal_1
6 Time taken: 0.011 seconds, Fetched: 9 row(s)
7 hive> drop table table_hive_xternal;
8 OK
9 Time taken: 0.476 seconds
10 hive> show tables ;
11 OK
12 table_hive_xternal_1
13 Time taken: 0.01 seconds, Fetched: 8 row(s)
14 hive>
15
16 //查询Hbase
17 hbase(main):014:0> scan 'table_hive_xternal',{LIMIT=>2}
18 ROW COLUMN+CELL
19 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:area_code, timestamp=1539681842885, value=weq
20 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:bureau_id, timestamp=1539681842885, value=13F1D05894
21 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:bureau_name, timestamp=1539681842885, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE5\xB9\xBF\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
22 \xE5\x85\xAC\xE5\x8F\xB8
23 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_code, timestamp=1539681842885, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5
24 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_id, timestamp=1539681842885, value=2210
25 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_name, timestamp=1539681842885, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2
26 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:dict_id, timestamp=1539681842885, value=12
27 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:group_id, timestamp=1539681842885, value=110
28 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:group_name, timestamp=1539681842885, value=\xE9\x9F\xA9\xE5\x9B\xBD\xE5\xA4\xA7\xE5\x8C\xBA
29 221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:sort, timestamp=1539681842885, value=1
30 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:area_code, timestamp=1539681842885, value=weq
31 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:bureau_id, timestamp=1539681842885, value=31E2F\xE4\xB8\x8D\xE7\x9F\xA582
32 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:bureau_name, timestamp=1539681842885, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE6\xB7\xB1\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
33 \xE5\x85\xAC\xE5\x8F\xB8
34 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_code, timestamp=1539681842885, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5
35 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_id, timestamp=1539681842885, value=3755
36 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_name, timestamp=1539681842885, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234
37 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:dict_id, timestamp=1539681842885, value=20
38 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:group_id, timestamp=1539681842885, value=110
39 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:group_name, timestamp=1539681842885, value=\xE8\x89\xBE\xE6\xAC\xA7\xE5\xB0\xBC\xE4\xBA\x9A\xE5\xA4\xA7\xE5\x8C\xBA
40 375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:sort, timestamp=1539681842885, value=1
41 2 row(s) in 0.0200 seconds
再走一次之前的流程把数据弄回来
先删除hbase 在查询Hive
1 //删除hbase
2 hbase(main):018:0> disable 'table_hive_xternal'
3 0 row(s) in 2.2310 seconds
4
5 hbase(main):019:0> drop 'table_hive_xternal'
6 0 row(s) in 1.2290 seconds
7
8 //查询Hive
9 hive> select * from table_hive_xternal;
10 OK
11 Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_xternal
12 Time taken: 0.109 seconds
2.3 Hive-Hbase 方式总结
2.3.1 管理表
- Hbase 是否需要先建立
不需要,在创建table_hive_mange后HBase表会自动创建
- 能否直接load数据到table_hive_mange
不能
1 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange;
2 hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange;
3 FAILED: SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD
- 删除表的影响
先删除HBase,数据已经被删除,此时虽然可以看到hive表但是已经没有数据(表信息还在),执行drop table 后报错 但是表信息已经被删除;
先删除Hive表,Hbase表同时也被删除
说明数据是存在HBase的而不是Hive
2.3.2 外部表
- Hbase 是否需要先建立
需要,如果事先建好HBase汇报下面的错误
1 hive> create external table table_hive_xternal
2 > (key String,
3 > dict_id String,
4 > city_id String,
5 > city_name String,
6 > city_code String,
7 > group_id String,
8 > group_name String,
9 > area_code String,
10 > bureau_id String,
11 > sort String,
12 > bureau_name String)
13 > row format delimited
14 > fields terminated by '|'
15 > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
16 > WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
17 > info:dict_id,
18 > info:city_id,
19 > info:city_name,
20 > info:city_code,
21 > info:group_id,
22 > info:group_name,
23 > info:area_code,
24 > info:bureau_id,
25 > info:sort,
26 > info:bureau_name")
27 > TBLPROPERTIES("hbase.table.name" = "table_hive_xternal");
28 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:MetaException(message:HBase table table_hive_xternal doesn't exist while the table is declared as an external table.)
29 at org.apache.hadoop.hive.hbase.HBaseStorageHandler.preCreateTable(HBaseStorageHandler.java:215)
......
- 能否直接load数据到table_hive_xternal
不能
1 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal;
2 hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal;
3 FAILED: SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD
- 删除表的影响
先删除Hive表,Hbase可以照常查询
先删除Hbase表,Hive表也会被删除
再次说明数据存储在Hbase
通过生成HFile导入HBase
要实现DataFrame通过HFile导入HBase有两个关键步骤
第一个是要生成Hfile
第二个是HFile导入HBase
测试DataFrame数据来自mysql,如果对读取mysql作为DataFrame不熟悉的人可以参考 Spark:读取mysql数据作为DataFrame当然也可以自己决定DataFrame的数据来源,此处以Mysql为例
1.mysql的信息
mysql的信息我保存在了外部的配置文件,这样方便后续的配置添加。
1 //配置文件示例:
2 [hdfs@iptve2e03 tmp_lillcol]$ cat job.properties
3 #mysql数据库配置
4 mysql.driver=com.mysql.jdbc.Driver
5 mysql.url=jdbc:mysql://127.0.0.1:3306/database1?useSSL=false&autoReconnect=true&failOverReadOnly=false&rewriteBatchedStatements=true
6 mysql.username=user
7 mysql.password=123456
2.需要的jar依赖
sbt版本,maven的对应修改即可
1 libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.0-cdh5.7.2"
2 libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.0-cdh5.7.2"
3 libraryDependencies += "org.apache.spark" % "spark-hive_2.10" % "1.6.0-cdh5.7.2"
4 libraryDependencies += "org.apache.hbase" % "hbase-client" % "1.2.0-cdh5.7.2"
5 libraryDependencies += "org.apache.hbase" % "hbase-server" % "1.2.0-cdh5.7.2"
6 libraryDependencies += "org.apache.hbase" % "hbase-common" % "1.2.0-cdh5.7.2"
7 libraryDependencies += "org.apache.hbase" % "hbase-protocol" % "1.2.0-cdh5.7.2"
8 libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.38"
9 libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.6.0-cdh5.7.2"
10 libraryDependencies += "com.yammer.metrics" % "metrics-core" % "2.2.0"
3. 完整代码
1 import java.io.FileInputStream
2 import java.util.Properties
3
4 import org.apache.hadoop.conf.Configuration
5 import org.apache.hadoop.fs.{FileSystem, Path}
6 import org.apache.hadoop.fs.permission.{FsAction, FsPermission}
7 import org.apache.hadoop.hbase.io.ImmutableBytesWritable
8 import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2
9 import org.apache.hadoop.hbase.util.Bytes
10 import org.apache.hadoop.hbase.{HBaseConfiguration, KeyValue}
11 import org.apache.hadoop.mapreduce.Job
12 import org.apache.spark.rdd.RDD
13 import org.apache.spark.sql.functions.{concat, lit}
14 import org.apache.spark.sql.hive.HiveContext
15 import org.apache.spark.sql.{DataFrame, SQLContext}
16 import org.apache.spark.{SparkConf, SparkContext}
17
18 /**
19 * @author 利伊奥克儿-lillcol
20 * 2018/10/14-11:08
21 *
22 */
23 object TestHFile {
24 var hdfsPath: String = ""
25 var proPath: String = ""
26 var DATE: String = ""
27
28 val sparkConf: SparkConf = new SparkConf().setAppName(getClass.getSimpleName)
29 val sc: SparkContext = new SparkContext(sparkConf)
30 val sqlContext: SQLContext = new HiveContext(sc)
31
32 import sqlContext.implicits._
33
34 def main(args: Array[String]): Unit = {
35 hdfsPath = args(0)
36 proPath = args(1)
37
38 //HFile保存路径
39 val save_path: String = hdfsPath + "TableTestHFile"
40 //获取测试DataFrame
41 val dim_sys_city_dict: DataFrame = readMysqlTable(sqlContext, "DIM_SYS_CITY_DICT", proPath)
42
43 val resultDataFrame: DataFrame = dim_sys_city_dict
44 .select(concat($"city_id", lit("_"), $"city_name", lit("_"), $"city_code").as("key"), $"*")
45 //注:resultDataFrame 里面的 key 要放在第一位,因为后面需要对字段名排序
46 saveASHfFile(resultDataFrame, "cf_info", save_path)
47 }
48
49 /**
50 * 将DataFrame 保存为 HFile
51 *
52 * @param resultDataFrame 需要保存为HFile的 DataFrame,DataFrame的第一个字段必须为"key"
53 * @param clounmFamily 列族名称(必须在Hbase中存在,否则在load数据的时候会失败)
54 * @param save_path HFile的保存路径
55 */
56 def saveASHfFile(resultDataFrame: DataFrame, clounmFamily: String, save_path: String): Unit = {
57 val conf: Configuration = HBaseConfiguration.create()
58 lazy val job = Job.getInstance(conf)
59 job.setMapOutputKeyClass(classOf[ImmutableBytesWritable]) //设置MapOutput Key Value 的数据类型
60 job.setMapOutputValueClass(classOf[KeyValue])
61
62 var columnsName: Array[String] = resultDataFrame.columns //获取列名 第一个为key
63 columnsName = columnsName.drop(1).sorted //把key去掉 因为要排序
64
65 val result1: RDD[(ImmutableBytesWritable, Seq[KeyValue])] = resultDataFrame
66 .map(row => {
67 var kvlist: Seq[KeyValue] = List()
68 var rowkey: Array[Byte] = null
69 var cn: Array[Byte] = null
70 var v: Array[Byte] = null
71 var kv: KeyValue = null
72 val cf: Array[Byte] = clounmFamily.getBytes //列族
73 rowkey = Bytes.toBytes(row.getAs[String]("key")) //key
74 for (i <- 1 to (columnsName.length - 1)) {
75 cn = columnsName(i).getBytes() //列的名称
76 v = Bytes.toBytes(row.getAs[String](columnsName(i))) //列的值
77 //将rdd转换成HFile需要的格式,我们上面定义了Hfile的key是ImmutableBytesWritable,那么我们定义的RDD也是要以ImmutableBytesWritable的实例为key
78 kv = new KeyValue(rowkey, cf, cn, v) //封装一下 rowkey, cf, clounmVale, value
79 //
80 kvlist = kvlist :+ kv //将新的kv加在kvlist后面(不能反 需要整体有序)
81 }
82 (new ImmutableBytesWritable(rowkey), kvlist)
83 })
84
85 //RDD[(ImmutableBytesWritable, Seq[KeyValue])] 转换成 RDD[(ImmutableBytesWritable, KeyValue)]
86 val result: RDD[(ImmutableBytesWritable, KeyValue)] = result1.flatMapValues(s => {
87 s.iterator
88 })
89
90 delete_hdfspath(save_path) //删除save_path 原来的数据
91 //保存数据
92 result
93 .sortBy(x => x._1, true) //要保持 整体有序
94 .saveAsNewAPIHadoopFile(save_path,
95 classOf[ImmutableBytesWritable],
96 classOf[KeyValue],
97 classOf[HFileOutputFormat2],
98 job.getConfiguration)
99
100 }
101
102 /**
103 * 删除hdfs下的文件
104 *
105 * @param url 需要删除的路径
106 */
107 def delete_hdfspath(url: String) {
108 val hdfs: FileSystem = FileSystem.get(new Configuration)
109 val path: Path = new Path(url)
110 if (hdfs.exists(path)) {
111 val filePermission = new FsPermission(FsAction.ALL, FsAction.ALL, FsAction.READ)
112 hdfs.delete(path, true)
113 }
114 }
115
116 /**
117 * 获取 Mysql 表的数据
118 *
119 * @param sqlContext
120 * @param tableName 读取Mysql表的名字
121 * @param proPath 配置文件的路径
122 * @return 返回 Mysql 表的 DataFrame
123 */
124 def readMysqlTable(sqlContext: SQLContext, tableName: String, proPath: String) = {
125 val properties: Properties = getProPerties(proPath)
126 sqlContext
127 .read
128 .format("jdbc")
129 .option("url", properties.getProperty("mysql.url"))
130 .option("driver", properties.getProperty("mysql.driver"))
131 .option("user", properties.getProperty("mysql.username"))
132 .option("password", properties.getProperty("mysql.password"))
133 // .option("dbtable", tableName.toUpperCase)
134 .option("dbtable", tableName)
135 .load()
136
137 }
138
139 /**
140 * 获取 Mysql 表的数据 添加过滤条件
141 *
142 * @param sqlContext
143 * @param table 读取Mysql表的名字
144 * @param filterCondition 过滤条件
145 * @param proPath 配置文件的路径
146 * @return 返回 Mysql 表的 DataFrame
147 */
148 def readMysqlTable(sqlContext: SQLContext, table: String, filterCondition: String, proPath: String): DataFrame = {
149 val properties: Properties = getProPerties(proPath)
150 var tableName = ""
151 tableName = "(select * from " + table + " where " + filterCondition + " ) as t1"
152 sqlContext
153 .read
154 .format("jdbc")
155 .option("url", properties.getProperty("mysql.url"))
156 .option("driver", properties.getProperty("mysql.driver"))
157 .option("user", properties.getProperty("mysql.username"))
158 .option("password", properties.getProperty("mysql.password"))
159 .option("dbtable", tableName)
160 .load()
161 }
162
163 /**
164 * 获取配置文件
165 *
166 * @param proPath
167 * @return
168 */
169 def getProPerties(proPath: String): Properties = {
170 val properties: Properties = new Properties()
171 properties.load(new FileInputStream(proPath))
172 properties
173 }
174 }
4. 测试代码
1 def main(args: Array[String]): Unit = {
2 hdfsPath = args(0)
3 proPath = args(1)
4
5 //HFile保存路径
6 val save_path: String = hdfsPath + "TableTestHFile"
7 //获取测试DataFrame
8 val dim_sys_city_dict: DataFrame = readMysqlTable(sqlContext, "DIM_SYS_CITY_DICT", proPath)
9
10 val resultDataFrame: DataFrame = dim_sys_city_dict
11 .select(concat($"city_id", lit("_"), $"city_name", lit("_"), $"city_code").as("key"), $"*")
12 //注:resultDataFrame 里面的 key 要放在第一位,因为后面需要对字段名排序
13 saveASHfFile(resultDataFrame, "cf_info", save_path)
14 }
5. 执行命令
1 nohup spark-submit --master yarn \
2 --driver-memory 4G \
3 --num-executors 2 \
4 --executor-cores 4 \
5 --executor-memory 8G \
6 --class com.iptv.job.basedata.TestHFile \
7 --jars /var/lib/hadoop-hdfs/tmp_lillcol/mysql-connector-java-5.1.38.jar \
8 tygq.jar \
9 hdfs://ns1/user/hive/warehouse/ \
10 /var/lib/hadoop-hdfs/tmp_lillcol/job.properties > ./TestHFile.log 2>&1 &
6.执行结果
1 [hdfs@iptve2e03 tmp_lillcol]$ hadoop fs -du -h hdfs://ns1/user/hive/warehouse/TableTestHFile
2 0 0 hdfs://ns1/user/hive/warehouse/TableTestHFile/_SUCCESS
3 12.3 K 24.5 K hdfs://ns1/user/hive/warehouse/TableTestHFile/cf_info
7. HFile load 进 Hbase
1 hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://ns1/user/hive/warehouse/TableTestHFile iptv:spark_test
2
3 .....
4 18/10/17 10:14:20 INFO mapreduce.LoadIncrementalHFiles: Trying to load hfile=hdfs://ns1/user/hive/warehouse/TableTestHFile/cf_info/fdc37dc6811140dfa852ac71b00b33aa first=200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ last=769_\xE4\xB8\x9C\xE8\x8E\x9E_GD_DG
5 18/10/17 10:14:20 INFO client.ConnectionManager$HConnectionImplementation: Closing master protocol: MasterService
6 18/10/17 10:14:20 INFO client.ConnectionManager$HConnectionImplementation: Closing zookeeper sessionid=0x16604bba6872fff
7 18/10/17 10:14:20 INFO zookeeper.ClientCnxn: EventThread shut down
8 18/10/17 10:14:20 INFO zookeeper.ZooKeeper: Session: 0x16604bba6872fff closed
8.查看HBase中的数据
1 hbase(main):005:0> scan 'iptv:spark_test',{LIMIT=>2}
2 ROW COLUMN+CELL
3 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:bureau_id, timestamp=1539742949840, value=BF55
4 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:bureau_name, timestamp=1539742949840, value=\x85\xAC\xE5
5 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:city_code, timestamp=1539742949840, value=112
6 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:city_id, timestamp=1539742949840, value=112
7 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:city_name, timestamp=1539742949840, value=\xB7\x9E
8 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:dict_id, timestamp=1539742949840, value=112
9 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:group_id, timestamp=1539742949840, value=112
10 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:group_name, timestamp=1539742949840, value=\x8C\xBA
11 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:sort, timestamp=1539742949840, value=112
12 660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:bureau_id, timestamp=1539742949840, value=6AA0EF0B
13 660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:bureau_name, timestamp=1539742949840, value=xE5\x8F\xB8
14 660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:city_code, timestamp=1539742949840, value=112
15 660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:city_id, timestamp=1539742949840, value=112
16 660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:city_name, timestamp=1539742949840, value=\xBE
17 660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:dict_id, timestamp=1539742949840, value=112
18 660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:group_id, timestamp=1539742949840, value=112
19 660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:group_name, timestamp=1539742949840, value=\x8C\xBA
20 660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:sort, timestamp=1539742949840, value=112
9.总结
多列族,多列处理
通过算法将原本只能单个一个列族一个列处理的数据扩展到了多列族,多列处理。
实现的关键是下面的两段代码
1 var columnsName: Array[String] = resultDataFrame.columns //获取列名 第一个为key
2 columnsName = columnsName.drop(1).sorted //把key去掉 因为要排序
3
4 val result1: RDD[(ImmutableBytesWritable, Seq[KeyValue])] = resultDataFrame
5 .map(row => {
6 var kvlist: Seq[KeyValue] = List()
7 var rowkey: Array[Byte] = null
8 var cn: Array[Byte] = null
9 var v: Array[Byte] = null
10 var kv: KeyValue = null
11 val cf: Array[Byte] = clounmFamily.getBytes //列族
12 rowkey = Bytes.toBytes(row.getAs[String]("key")) //key
13 for (i <- 1 to (columnsName.length - 1)) {
14 cn = columnsName(i).getBytes() //列的名称
15 v = Bytes.toBytes(row.getAs[String](columnsName(i))) //列的值
16 //将rdd转换成HFile需要的格式,我们上面定义了Hfile的key是ImmutableBytesWritable,那么我们定义的RDD也是要以ImmutableBytesWritable的实例为key
17 kv = new KeyValue(rowkey, cf, cn, v) //封装一下 rowkey, cf, clounmVale, value
18 //
19 kvlist = kvlist :+ kv //将新的kv加在kvlist后面(不能反 需要整体有序)
20 }
21 (new ImmutableBytesWritable(rowkey), kvlist)
22 })
23
24 //RDD[(ImmutableBytesWritable, Seq[KeyValue])] 转换成 RDD[(ImmutableBytesWritable, KeyValue)]
25 val result: RDD[(ImmutableBytesWritable, KeyValue)] = result1.flatMapValues(s => {
26 s.iterator
27 })
DataFrame的优势就是它算是一个结构化数据,我们很容易对里面的每一个字段进行处理
- 通过resultDataFrame.columns获取所有列名,通过drop(1)删掉“key”,(序号从1开始)
- 通过sorted 对列名进行排序,默认就是升序的,如果不排序会报错,具体错误后面展示
- 然后通过map取出每一行一行数据,再通过for对每一个字段处理,每处理一个字段相关信息加入List,得到 RDD[(ImmutableBytesWritable, Seq[KeyValue])]
- 通过flatMapValues将RDD[(ImmutableBytesWritable, Seq[KeyValue])] 转换成 RDD[(ImmutableBytesWritable, KeyValue)]
通过上述处理,我们将得到RDD[(ImmutableBytesWritable, KeyValue)]类型的数据,就可以直接使用saveAsNewAPIHadoopFile这个方法了
排序
此处有两个地方进行了排序
- rowkey
这个就不用说了,这个必须要整体有序,实现代码
1 //保存数据
2 result
3 .sortBy(x => x._1, true) //要保持 整体有序
4 .saveAsNewAPIHadoopFile(save_path,
5 classOf[ImmutableBytesWritable],
6 classOf[KeyValue],
7 classOf[HFileOutputFormat2],
8 job.getConfiguration)
- 列名
1 //列名也要保持整体有序,实现代码
2 var columnsName: Array[String] = resultDataFrame.columns //获取列名 第一个为key;
3 columnsName = columnsName.drop(1).sorted //把key去掉 因为要排序
如果不排序 会出现下面的错误
1 18/10/15 14:19:32 WARN scheduler.TaskSetManager: Lost task 0.1 in stage 2.0 (TID 3, iptve2e03): java.io.IOException: Added a key not lexically larger than previous.
2 Current cell = 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ/cf_info:area_code/1539584366048/Put/vlen=5/seqid=0,
3 lastCell = 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ/cf_info:dict_id/1539584366048/Put/vlen=2/seqid=0
上面的意思是当前列名cf_info:area_code比前一个列名cf_info:dict_id小,这就是为什么需要对列名排序的原因,同时还要把key删除掉,因为不删除会出现cf_info:key这个列,这显然是不如何要求的。
而把key放在第一位也是为了在这个步骤中删除掉key,否则一经排序就很难轻松的删除掉key了
保存路径
保存的路径不能存在,那就删除呗
1 /**
2 * 删除hdfs下的文件
3 *
4 * @param url 需要删除的路径
5 */
6 def delete_hdfspath(url: String) {
7 val hdfs: FileSystem = FileSystem.get(new Configuration)
8 val path: Path = new Path(url)
9 if (hdfs.exists(path)) {
10 val filePermission = new FsPermission(FsAction.ALL, FsAction.ALL, FsAction.READ)
11 hdfs.delete(path, true)
12 }
13 }
列族名称
列族需要在Hbase中存在,列可以不存在
对比总结
Hive-Hbase
- 优点:
关联Hive,容易对数据进行二次加工
操作相对简单,要求没那么高
可以轻易处理多列族多列问题
- 缺点:
建立一张临时表,消耗空间增加一倍左右
load数据的时候很快,但是insert into的时候耗费时间与数据量相关
HFile
- 优点:
Load数据很快
从头到尾产生的文件只有一个HFile,必两一种方式节省空间
- 缺点:
数据很难二次加工,查询如果没有工具很不友好
对开发有一定的要求
至于两种方式如何选择,看需求。
此文为本人日常工作总结,转载请标明出处!!!!!!!