Spark:DataFrame批量导入Hbase的两种方式(HFile、Hive)
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,必两一种方式节省空间
- 缺点:
数据很难二次加工,查询如果没有工具很不友好
对开发有一定的要求
至于两种方式如何选择,看需求。
此文为本人日常工作总结,转载请标明出处!!!!!!!