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

 drop table table_hive_mange;
create table table_hive_mange
(key String,
dict_id String,
city_id String,
city_name String,
city_code String,
group_id String,
group_name String,
area_code String,
bureau_id String,
sort String,
bureau_name String)
row format delimited
fields terminated by '|'
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
info:dict_id,
info:city_id,
info:city_name,
info:city_code,
info:group_id,
info:group_name,
info:area_code,
info:bureau_id, info:sort,
info:bureau_name")
TBLPROPERTIES("hbase.table.name" = "table_hive_mange"); hive> drop table table_hive_mange;
OK
Time taken: 1.554 seconds
hive> create table table_hive_mange
> (key String,
> dict_id String,
> city_id String,
> city_name String,
> city_code String,
> group_id String,
> group_name String,
> area_code String,
> bureau_id String,
> sort String,
> bureau_name String)
> row format delimited
> fields terminated by '|'
> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
> info:dict_id,
> info:city_id,
> info:city_name,
> info:city_code,
> info:group_id,
> info:group_name,
> info:area_code,
> info:bureau_id, info:sort,
> info:bureau_name")
> TBLPROPERTIES("hbase.table.name" = "table_hive_mange");
OK
Time taken: 6.884 seconds hive> desc formatted table_hive_mange;
OK
# col_name data_type comment key string from deserializer
dict_id string from deserializer
city_id string from deserializer
city_name string from deserializer
city_code string from deserializer
group_id string from deserializer
group_name string from deserializer
area_code string from deserializer
bureau_id string from deserializer
sort string from deserializer
bureau_name string from deserializer # Detailed Table Information
Database: default
Owner: hdfs
CreateTime: Tue Oct 16 16:23:22 CST 2018
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://ns1/user/hive/warehouse/table_hive_mange
Table Type: MANAGED_TABLE
Table Parameters:
hbase.table.name table_hive_mange
storage_handler org.apache.hadoop.hive.hbase.HBaseStorageHandler
transient_lastDdlTime 1539678202 # Storage Information
SerDe Library: org.apache.hadoop.hive.hbase.HBaseSerDe
InputFormat: null
OutputFormat: null
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
field.delim |
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
serialization.format |
Time taken: 2.098 seconds, Fetched: 40 row(s) //此时HBase表已经生成
hbase(main):001:0> desc 'table_hive_mange'
Table table_hive_mange is ENABLED
table_hive_mange
COLUMN FAMILIES DESCRIPTION
{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 =>
'65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.3910 seconds hbase(main):002:0>  

1.2 创建普通的hive管理表

 drop table table_hive_mange1;
create table table_hive_mange1
(key String,
dict_id String,
city_id String,
city_name String,
city_code String,
group_id String,
group_name String,
area_code String,
bureau_id String,
sort String,
bureau_name String)
row format delimited
fields terminated by '|'
STORED AS TEXTFILE; hive> drop table table_hive_mange1;
OK
Time taken: 0.027 seconds
hive> create table table_hive_mange1
> (key String,
> dict_id String,
> city_id String,
> city_name String,
> city_code String,
> group_id String,
> group_name String,
> area_code String,
> bureau_id String,
> sort String,
> bureau_name String)
> row format delimited
> fields terminated by '|'
> STORED AS TEXTFILE;
OK
Time taken: 0.188 seconds
hive> desc formatted
> table_hive_mange1;
OK
# col_name data_type comment key string
dict_id string
city_id string
city_name string
city_code string
group_id string
group_name string
area_code string
bureau_id string
sort string
bureau_name string # Detailed Table Information
Database: default
Owner: hdfs
CreateTime: Tue Oct 16 16:24:41 CST 2018
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://ns1/user/hive/warehouse/table_hive_mange1
Table Type: MANAGED_TABLE
Table Parameters:
transient_lastDdlTime 1539678281 # Storage Information
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
field.delim |
serialization.format |
Time taken: 4.3 seconds, Fetched: 37 row(s) 

1.3 准备一份数据

 [hdfs@iptve2e03 tmp_lillcol]$ hadoop fs -cat hdfs://ns1/user/hive/warehouse//hive-hbase
736_9铜锣湾1|1|73629|铜锣湾1|啥子字段|110|艾欧尼亚大区|weq|76D5A3D3EA4|1|汉东省东中猴姑米西翻公司
475_铜锣湾2|13|4750|铜锣湾2|啥子字段|110|艾欧尼亚大区|weq|5F4E9不知C5|1|汉东省江中猴姑米西翻公司
765_铜锣湾3|3|7650|铜锣湾3|啥子字段|110|艾欧尼亚大区|weq|59B4B不知92|1|汉东省中中猴姑米西翻公司
667_铜锣湾4|14|6672|铜锣湾4|啥子字段|110|艾欧尼亚大区|weq|CF19F不知名B|21|汉东省阳中猴姑米西翻公司
758_铜锣湾5|4|7586|铜锣湾5|啥子字段|110|黑莓尼亚大区|weq|507EB不知78|1|汉东省珠中猴姑米西翻公司
796_铜锣湾6|15|7966|铜锣湾6|啥子字段|110|艾欧尼亚大区|weq|9C9C0不知名4|21|汉东省云中猴姑米西翻公司
754_8铜锣湾7|5|75468|铜锣湾7|啥子字段|110|艾欧尼亚大区|weq|5B736不知名F|11|汉东省潮中猴姑米西翻公司
706_铜锣湾8|16|7062|铜锣湾8|啥子字段|110|艾欧尼亚大区|weq|51A88不知名8|11|汉东省河中猴姑米西翻公司
754_铜锣湾9|6|7547|铜锣湾9|啥子字段|110|艾欧尼亚大区|weq|EEA9F不知59|1|汉东省佛中猴姑米西翻公司
626_铜锣湾0|17|6263|铜锣湾0|啥子字段|110|瑞本大区|weq|9FF783FEE9|11|汉东省揭中猴姑米西翻公司
754_铜锣湾-|7|7542|铜锣湾-|啥子字段|110|艾欧尼亚大区|weq|246A1不知FC|1|汉东省惠中猴姑米西翻公司
755_铜锣湾12|18|7553|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|E9BE9不知名9|11|汉东省梅中猴姑米西翻公司
661_铜锣湾12|8|6618|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|5D0A9不知名E|11|汉东省茂中猴姑米西翻公司
765_铜锣湾3|19|7651|铜锣湾3|啥子字段|110|德玛西亚尼亚大区|weq|BD6F不6379|11|汉东省韶中猴姑米西翻公司
754_铜锣湾32|9|7544|铜锣湾32|啥子字段|110|艾欧尼亚大区|weq|18D7A不知1E|1|汉东省汕中猴姑米西翻公司
375_铜锣湾234|20|3755|铜锣湾234|啥子字段|110|艾欧尼亚大区|weq|31E2F不知82|1|汉东省深中猴姑米西翻公司
626_0铜锣湾45|10|62630|铜锣湾45|啥子字段|110|艾欧尼亚大区|weq|1BA07不知名B|11|汉东省汕中猴姑米西翻公司
458铜锣湾99|21|458|铜锣湾99|啥子字段|110|艾欧尼亚大区|weq|3C09D不知名B|11|汉东省肇中猴姑米西翻公司
715铜锣湾12|11|715|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|3A49A不知名7|11|汉东省湛中猴姑米西翻公司
723_铜锣湾3|2|7231|铜锣湾3|啥子字段|110|台湾大区|weq|F8E9FCB7B1|11|汉东省清中猴姑米西翻公司
221_铜锣湾2|12|2210|铜锣湾2|啥子字段|110|韩国大区|weq|13F1D05894|1|汉东省广中猴姑米西翻公司 

1.4 向 table_hive_mange1 中添加数据

 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange1;
hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange1;
Loading data to table default.table_hive_mange1
Table default.table_hive_mange1 stats: [numFiles=1, totalSize=1947]
OK
Time taken: 0.402 seconds
hive>

1.5 查看 table_hive_mange1 中的数据

 hive> select * from table_hive_mange1;
OK
736_9铜锣湾1 1 73629 铜锣湾1 啥子字段 110 艾欧尼亚大区 weq 76D5A3D3EA4 1 汉东省东中猴姑米西翻公司
475_铜锣湾2 13 4750 铜锣湾2 啥子字段 110 艾欧尼亚大区 weq 5F4E9不知C5 1 汉东省江中猴姑米西翻公司
765_铜锣湾3 3 7650 铜锣湾3 啥子字段 110 艾欧尼亚大区 weq 59B4B不知92 1 汉东省中中猴姑米西翻公司
667_铜锣湾4 14 6672 铜锣湾4 啥子字段 110 艾欧尼亚大区 weq CF19F不知名B 21 汉东省阳中猴姑米西翻公司
758_铜锣湾5 4 7586 铜锣湾5 啥子字段 110 黑莓尼亚大区 weq 507EB不知78 1 汉东省珠中猴姑米西翻公司
796_铜锣湾6 15 7966 铜锣湾6 啥子字段 110 艾欧尼亚大区 weq 9C9C0不知名4 21 汉东省云中猴姑米西翻公司
754_8铜锣湾7 5 75468 铜锣湾7 啥子字段 110 艾欧尼亚大区 weq 5B736不知名F 11 汉东省潮中猴姑米西翻公司
706_铜锣湾8 16 7062 铜锣湾8 啥子字段 110 艾欧尼亚大区 weq 51A88不知名8 11 汉东省河中猴姑米西翻公司
754_铜锣湾9 6 7547 铜锣湾9 啥子字段 110 艾欧尼亚大区 weq EEA9F不知59 1 汉东省佛中猴姑米西翻公司
626_铜锣湾0 17 6263 铜锣湾0 啥子字段 110 瑞本大区 weq 9FF783FEE9 11 汉东省揭中猴姑米西翻公司
754_铜锣湾- 7 7542 铜锣湾- 啥子字段 110 艾欧尼亚大区 weq 246A1不知FC 1 汉东省惠中猴姑米西翻公司
755_铜锣湾12 18 7553 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq E9BE9不知名9 11 汉东省梅中猴姑米西翻公司
661_铜锣湾12 8 6618 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 5D0A9不知名E 11 汉东省茂中猴姑米西翻公司
765_铜锣湾3 19 7651 铜锣湾3 啥子字段 110 德玛西亚尼亚大区 weq BD6F不6379 11 汉东省韶中猴姑米西翻公司
754_铜锣湾32 9 7544 铜锣湾32 啥子字段 110 艾欧尼亚大区 weq 18D7A不知1E 1 汉东省汕中猴姑米西翻公司
375_铜锣湾234 20 3755 铜锣湾234 啥子字段 110 艾欧尼亚大区 weq 31E2F不知82 1 汉东省深中猴姑米西翻公司
626_0铜锣湾45 10 62630 铜锣湾45 啥子字段 110 艾欧尼亚大区 weq 1BA07不知名B 11 汉东省汕中猴姑米西翻公司
458铜锣湾99 21 458 铜锣湾99 啥子字段 110 艾欧尼亚大区 weq 3C09D不知名B 11 汉东省肇中猴姑米西翻公司
715铜锣湾12 11 715 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 3A49A不知名7 11 汉东省湛中猴姑米西翻公司
723_铜锣湾3 2 7231 铜锣湾3 啥子字段 110 台湾大区 weq F8E9FCB7B1 11 汉东省清中猴姑米西翻公司
221_铜锣湾2 12 2210 铜锣湾2 啥子字段 110 韩国大区 weq 13F1D05894 1 汉东省广中猴姑米西翻公司
Time taken: 0.035 seconds, Fetched: 21 row(s)
hive>  

1.6 将 table_hive_mange1 的数据插入 table_hive_mange

 insert into table  table_hive_mange  select * from table_hive_mange1;

 hive> insert into table  table_hive_mange  select * from table_hive_mange1;
Query ID = hdfs_20181016165252_4e5b605f-0351-4bd0-aa2e-0d9829694f6d
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there s no reduce operator
Starting Job = job_1519375199907_258533, Tracking URL = http://iptve2e01:8088/proxy/application_1519375199907_258533/
Kill Command = /opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop/bin/hadoop job -kill job_1519375199907_258533
Hadoop job information for Stage-0: number of mappers: 1; number of reducers: 0
2018-10-16 16:53:46,259 Stage-0 map = 0%, reduce = 0%
2018-10-16 16:54:06,773 Stage-0 map = 100%, reduce = 0%, Cumulative CPU 6.65 sec
MapReduce Total cumulative CPU time: 6 seconds 650 msec
Ended Job = job_1519375199907_258533
MapReduce Jobs Launched:
Stage-Stage-0: Map: 1 Cumulative CPU: 6.65 sec HDFS Read: 7381 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 650 msec
OK
Time taken: 89.331 seconds 

1.7 查看table_hive_mange 中的数据

 hive> select * from table_hive_mange 中的数据;
OK
221_铜锣湾2 12 2210 铜锣湾2 啥子字段 110 韩国大区 weq 13F1D05894 1 汉东省广中猴姑米西翻公司
375_铜锣湾234 20 3755 铜锣湾234 啥子字段 110 艾欧尼亚大区 weq 31E2F不知82 1 汉东省深中猴姑米西翻公司
458铜锣湾99 21 458 铜锣湾99 啥子字段 110 艾欧尼亚大区 weq 3C09D不知名B 11 汉东省肇中猴姑米西翻公司
475_铜锣湾2 13 4750 铜锣湾2 啥子字段 110 艾欧尼亚大区 weq 5F4E9不知C5 1 汉东省江中猴姑米西翻公司
626_0铜锣湾45 10 62630 铜锣湾45 啥子字段 110 艾欧尼亚大区 weq 1BA07不知名B 11 汉东省汕中猴姑米西翻公司
626_铜锣湾0 17 6263 铜锣湾0 啥子字段 110 瑞本大区 weq 9FF783FEE9 11 汉东省揭中猴姑米西翻公司
661_铜锣湾12 8 6618 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 5D0A9不知名E 11 汉东省茂中猴姑米西翻公司
667_铜锣湾4 14 6672 铜锣湾4 啥子字段 110 艾欧尼亚大区 weq CF19F不知名B 21 汉东省阳中猴姑米西翻公司
706_铜锣湾8 16 7062 铜锣湾8 啥子字段 110 艾欧尼亚大区 weq 51A88不知名8 11 汉东省河中猴姑米西翻公司
715铜锣湾12 11 715 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 3A49A不知名7 11 汉东省湛中猴姑米西翻公司
723_铜锣湾3 2 7231 铜锣湾3 啥子字段 110 台湾大区 weq F8E9FCB7B1 11 汉东省清中猴姑米西翻公司
736_9铜锣湾1 1 73629 铜锣湾1 啥子字段 110 艾欧尼亚大区 weq 76D5A3D3EA4 1 汉东省东中猴姑米西翻公司
754_8铜锣湾7 5 75468 铜锣湾7 啥子字段 110 艾欧尼亚大区 weq 5B736不知名F 11 汉东省潮中猴姑米西翻公司
754_铜锣湾- 7 7542 铜锣湾- 啥子字段 110 艾欧尼亚大区 weq 246A1不知FC 1 汉东省惠中猴姑米西翻公司
754_铜锣湾32 9 7544 铜锣湾32 啥子字段 110 艾欧尼亚大区 weq 18D7A不知1E 1 汉东省汕中猴姑米西翻公司
754_铜锣湾9 6 7547 铜锣湾9 啥子字段 110 艾欧尼亚大区 weq EEA9F不知59 1 汉东省佛中猴姑米西翻公司
755_铜锣湾12 18 7553 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq E9BE9不知名9 11 汉东省梅中猴姑米西翻公司
758_铜锣湾5 4 7586 铜锣湾5 啥子字段 110 黑莓尼亚大区 weq 507EB不知78 1 汉东省珠中猴姑米西翻公司
765_铜锣湾3 19 7651 铜锣湾3 啥子字段 110 德玛西亚尼亚大区 weq BD6F不6379 11 汉东省韶中猴姑米西翻公司
796_铜锣湾6 15 7966 铜锣湾6 啥子字段 110 艾欧尼亚大区 weq 9C9C0不知名4 21 汉东省云中猴姑米西翻公司
Time taken: 0.29 seconds, Fetched: 20 row(s)
hive>  

1.8 查看HBase中 table_hive_mange 的数据

 hbase(main):008:0> scan 'table_hive_mange',{LIMIT=>2}
ROW COLUMN+CELL
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:area_code, timestamp=1539680045751, value=weq
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:bureau_id, timestamp=1539680045751, value=13F1D05894
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
\xE5\x85\xAC\xE5\x8F\xB8
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
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_id, timestamp=1539680045751, value=2210
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
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:dict_id, timestamp=1539680045751, value=12
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:group_id, timestamp=1539680045751, value=110
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
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:sort, timestamp=1539680045751, value=1
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:area_code, timestamp=1539680045751, value=weq
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:bureau_id, timestamp=1539680045751, value=31E2F\xE4\xB8\x8D\xE7\x9F\xA582
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
\xE5\x85\xAC\xE5\x8F\xB8
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
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_id, timestamp=1539680045751, value=3755
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
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:dict_id, timestamp=1539680045751, value=20
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:group_id, timestamp=1539680045751, value=110
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
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:sort, timestamp=1539680045751, value=1
2 row(s) in 0.0140 seconds hbase(main):009:0>

1.9 删除表

 先删除hbase(disabled->drop)

 hbase(main):009:0> disable 'table_hive_mange'
0 row(s) in 2.2700 seconds hbase(main):010:0> drop 'table_hive_mange'
0 row(s) in 1.2290 seconds hive> show tables;
OK
frt_user_auth_log1
table_hive_mange
table_hive_mange1
Time taken: 0.116 seconds, Fetched: 8 row(s)
hive> select * from table_hive_mange;
OK
Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange
Time taken: 0.245 seconds
hive> select * from table_hive_mange;
OK
Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange
Time taken: 0.148 seconds
hive> show tables;
OK
table_hive_mange
table_hive_mange1
Time taken: 0.01 seconds, Fetched: 8 row(s)
hive> select * from table_hive_mange;
OK
Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange
Time taken: 0.09 seconds
hive> drop table table_hive_mange;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange
at org.apache.hadoop.hbase.client.HBaseAdmin.checkTableExistence(HBaseAdmin.java:1466)
at org.apache.hadoop.hbase.client.HBaseAdmin.isTableEnabled(HBaseAdmin.java:1477)
at org.apache.hadoop.hbase.client.HBaseAdmin.isTableEnabled(HBaseAdmin.java:1486)
...
)
hive> show tables;
OK
table_hive_mange1
Time taken: 0.009 seconds, Fetched: 7 row(s) //先删除Hive表
hive> drop table table_hive_mange;
OK
Time taken: 6.604 seconds hbase(main):032:0> scan 'table_hive_mange',{LIMIT=>2}
ROW COLUMN+CELL ERROR: Unknown table table_hive_mange! hbase(main):033:0> list 

2.Hive为外部表

2.1 创建 Hbase 表 table_hive_xternal

 create  'table_hive_xternal','info'

 hbase(main):012:0> create  'table_hive_xternal','info'
0 row(s) in 1.2450 seconds => Hbase::Table - table_hive_xternal
hbase(main):013:0>  

2.2 建立外部表(hive),关联存在hbase表

 drop table table_hive_xternal;
create external table table_hive_xternal
(key String,
dict_id String,
city_id String,
city_name String,
city_code String,
group_id String,
group_name String,
area_code String,
bureau_id String,
sort String,
bureau_name String)
row format delimited
fields terminated by '|'
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
info:dict_id,
info:city_id,
info:city_name,
info:city_code,
info:group_id,
info:group_name,
info:area_code,
info:bureau_id,
info:sort,
info:bureau_name")
TBLPROPERTIES("hbase.table.name" = "table_hive_xternal");

 hive> create external table table_hive_xternal
> (key String,
> dict_id String,
> city_id String,
> city_name String,
> city_code String,
> group_id String,
> group_name String,
> area_code String,
> bureau_id String,
> sort String,
> bureau_name String)
> row format delimited
> fields terminated by '|'
> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
> info:dict_id,
> info:city_id,
> info:city_name,
> info:city_code,
> info:group_id,
> info:group_name,
> info:area_code,
> info:bureau_id,
> info:sort,
> info:bureau_name")
> TBLPROPERTIES("hbase.table.name" = "table_hive_xternal");
OK
Time taken: 0.092 seconds hive> desc formatted table_hive_xternal;
OK
# col_name data_type comment key string from deserializer
dict_id string from deserializer
city_id string from deserializer
city_name string from deserializer
city_code string from deserializer
group_id string from deserializer
group_name string from deserializer
area_code string from deserializer
bureau_id string from deserializer
sort string from deserializer
bureau_name string from deserializer # Detailed Table Information
Database: default
Owner: hdfs
CreateTime: Tue Oct 16 17:20:26 CST 2018
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://ns1/user/hive/warehouse/table_hive_xternal
Table Type: EXTERNAL_TABLE
Table Parameters:
EXTERNAL TRUE
hbase.table.name table_hive_xternal
storage_handler org.apache.hadoop.hive.hbase.HBaseStorageHandler
transient_lastDdlTime 1539681626 # Storage Information
SerDe Library: org.apache.hadoop.hive.hbase.HBaseSerDe
InputFormat: null
OutputFormat: null
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
field.delim |
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
serialization.format |
Time taken: 0.882 seconds, Fetched: 41 row(s) 

2.3创建普通的 hive 管理表

 drop table table_hive_xternal_1;
create table table_hive_xternal_1
(key String,
dict_id String,
city_id String,
city_name String,
city_code String,
group_id String,
group_name String,
area_code String,
bureau_id String,
sort String,
bureau_name String)
row format delimited
fields terminated by '|'
STORED AS TEXTFILE;
 hive> desc formatted table_hive_xternal_1;
OK
# col_name data_type comment key string
dict_id string
city_id string
city_name string
city_code string
group_id string
group_name string
area_code string
bureau_id string
sort string
bureau_name string # Detailed Table Information
Database: default
Owner: hdfs
CreateTime: Tue Oct 16 17:21:05 CST 2018
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://ns1/user/hive/warehouse/table_hive_xternal_1
Table Type: MANAGED_TABLE
Table Parameters:
transient_lastDdlTime 1539681665 # Storage Information
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
field.delim |
serialization.format |
Time taken: 0.033 seconds, Fetched: 37 row(s) 

2.4 准备一份数据

 [hdfs@iptve2e03 tmp_lillcol]$ hadoop fs -cat hdfs://ns1/user/hive/warehouse/hive-hbase
736_9铜锣湾1|1|73629|铜锣湾1|啥子字段|110|艾欧尼亚大区|weq|76D5A3D3EA4|1|汉东省东中猴姑米西翻公司
475_铜锣湾2|13|4750|铜锣湾2|啥子字段|110|艾欧尼亚大区|weq|5F4E9不知C5|1|汉东省江中猴姑米西翻公司
765_铜锣湾3|3|7650|铜锣湾3|啥子字段|110|艾欧尼亚大区|weq|59B4B不知92|1|汉东省中中猴姑米西翻公司
667_铜锣湾4|14|6672|铜锣湾4|啥子字段|110|艾欧尼亚大区|weq|CF19F不知名B|21|汉东省阳中猴姑米西翻公司
758_铜锣湾5|4|7586|铜锣湾5|啥子字段|110|黑莓尼亚大区|weq|507EB不知78|1|汉东省珠中猴姑米西翻公司
796_铜锣湾6|15|7966|铜锣湾6|啥子字段|110|艾欧尼亚大区|weq|9C9C0不知名4|21|汉东省云中猴姑米西翻公司
754_8铜锣湾7|5|75468|铜锣湾7|啥子字段|110|艾欧尼亚大区|weq|5B736不知名F|11|汉东省潮中猴姑米西翻公司
706_铜锣湾8|16|7062|铜锣湾8|啥子字段|110|艾欧尼亚大区|weq|51A88不知名8|11|汉东省河中猴姑米西翻公司
754_铜锣湾9|6|7547|铜锣湾9|啥子字段|110|艾欧尼亚大区|weq|EEA9F不知59|1|汉东省佛中猴姑米西翻公司
626_铜锣湾0|17|6263|铜锣湾0|啥子字段|110|瑞本大区|weq|9FF783FEE9|11|汉东省揭中猴姑米西翻公司
754_铜锣湾-|7|7542|铜锣湾-|啥子字段|110|艾欧尼亚大区|weq|246A1不知FC|1|汉东省惠中猴姑米西翻公司
755_铜锣湾12|18|7553|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|E9BE9不知名9|11|汉东省梅中猴姑米西翻公司
661_铜锣湾12|8|6618|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|5D0A9不知名E|11|汉东省茂中猴姑米西翻公司
765_铜锣湾3|19|7651|铜锣湾3|啥子字段|110|德玛西亚尼亚大区|weq|BD6F不6379|11|汉东省韶中猴姑米西翻公司
754_铜锣湾32|9|7544|铜锣湾32|啥子字段|110|艾欧尼亚大区|weq|18D7A不知1E|1|汉东省汕中猴姑米西翻公司
375_铜锣湾234|20|3755|铜锣湾234|啥子字段|110|艾欧尼亚大区|weq|31E2F不知82|1|汉东省深中猴姑米西翻公司
626_0铜锣湾45|10|62630|铜锣湾45|啥子字段|110|艾欧尼亚大区|weq|1BA07不知名B|11|汉东省汕中猴姑米西翻公司
458铜锣湾99|21|458|铜锣湾99|啥子字段|110|艾欧尼亚大区|weq|3C09D不知名B|11|汉东省肇中猴姑米西翻公司
715铜锣湾12|11|715|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|3A49A不知名7|11|汉东省湛中猴姑米西翻公司
723_铜锣湾3|2|7231|铜锣湾3|啥子字段|110|台湾大区|weq|F8E9FCB7B1|11|汉东省清中猴姑米西翻公司
221_铜锣湾2|12|2210|铜锣湾2|啥子字段|110|韩国大区|weq|13F1D05894|1|汉东省广中猴姑米西翻公司 

2.5 向 table_hive_xternal_1 中添加数据

 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal_1;
hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal_1;
Loading data to table default.table_hive_xternal_1
Table default.table_hive_xternal_1 stats: [numFiles=1, totalSize=2681]
OK
Time taken: 0.534 seconds 

2.6 查看 table_hive_xternal_1 中的数据

 hive> select * from table_hive_xternal_1;
OK
736_9铜锣湾1 1 73629 铜锣湾1 啥子字段 110 艾欧尼亚大区 weq 76D5A3D3EA4 1 汉东省东中猴姑米西翻公司
475_铜锣湾2 13 4750 铜锣湾2 啥子字段 110 艾欧尼亚大区 weq 5F4E9不知C5 1 汉东省江中猴姑米西翻公司
765_铜锣湾3 3 7650 铜锣湾3 啥子字段 110 艾欧尼亚大区 weq 59B4B不知92 1 汉东省中中猴姑米西翻公司
667_铜锣湾4 14 6672 铜锣湾4 啥子字段 110 艾欧尼亚大区 weq CF19F不知名B 21 汉东省阳中猴姑米西翻公司
758_铜锣湾5 4 7586 铜锣湾5 啥子字段 110 黑莓尼亚大区 weq 507EB不知78 1 汉东省珠中猴姑米西翻公司
796_铜锣湾6 15 7966 铜锣湾6 啥子字段 110 艾欧尼亚大区 weq 9C9C0不知名4 21 汉东省云中猴姑米西翻公司
754_8铜锣湾7 5 75468 铜锣湾7 啥子字段 110 艾欧尼亚大区 weq 5B736不知名F 11 汉东省潮中猴姑米西翻公司
706_铜锣湾8 16 7062 铜锣湾8 啥子字段 110 艾欧尼亚大区 weq 51A88不知名8 11 汉东省河中猴姑米西翻公司
754_铜锣湾9 6 7547 铜锣湾9 啥子字段 110 艾欧尼亚大区 weq EEA9F不知59 1 汉东省佛中猴姑米西翻公司
626_铜锣湾0 17 6263 铜锣湾0 啥子字段 110 瑞本大区 weq 9FF783FEE9 11 汉东省揭中猴姑米西翻公司
754_铜锣湾- 7 7542 铜锣湾- 啥子字段 110 艾欧尼亚大区 weq 246A1不知FC 1 汉东省惠中猴姑米西翻公司
755_铜锣湾12 18 7553 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq E9BE9不知名9 11 汉东省梅中猴姑米西翻公司
661_铜锣湾12 8 6618 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 5D0A9不知名E 11 汉东省茂中猴姑米西翻公司
765_铜锣湾3 19 7651 铜锣湾3 啥子字段 110 德玛西亚尼亚大区 weq BD6F不6379 11 汉东省韶中猴姑米西翻公司
754_铜锣湾32 9 7544 铜锣湾32 啥子字段 110 艾欧尼亚大区 weq 18D7A不知1E 1 汉东省汕中猴姑米西翻公司
375_铜锣湾234 20 3755 铜锣湾234 啥子字段 110 艾欧尼亚大区 weq 31E2F不知82 1 汉东省深中猴姑米西翻公司
626_0铜锣湾45 10 62630 铜锣湾45 啥子字段 110 艾欧尼亚大区 weq 1BA07不知名B 11 汉东省汕中猴姑米西翻公司
458铜锣湾99 21 458 铜锣湾99 啥子字段 110 艾欧尼亚大区 weq 3C09D不知名B 11 汉东省肇中猴姑米西翻公司
715铜锣湾12 11 715 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 3A49A不知名7 11 汉东省湛中猴姑米西翻公司
723_铜锣湾3 2 7231 铜锣湾3 啥子字段 110 台湾大区 weq F8E9FCB7B1 11 汉东省清中猴姑米西翻公司
221_铜锣湾2 12 2210 铜锣湾2 啥子字段 110 韩国大区 weq 13F1D05894 1 汉东省广中猴姑米西翻公司
Time taken: 0.036 seconds, Fetched: 21 row(s) 

2.7 将table_hive_xternal_1 的数据插入 table_hive_xternal

 insert into table table_hive_xternal select * from table_hive_xternal_1;
hive> insert into table table_hive_xternal select * from table_hive_xternal_1;
Query ID = hdfs_20181016172323_aad773d7-444f-431c-b0a2-917756ec965f
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1519375199907_258597, Tracking URL = http://127.0.0.1:8088/proxy/application_1519375199907_258597/
Kill Command = /opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop/bin/hadoop job -kill job_1519375199907_258597
Hadoop job information for Stage-0: number of mappers: 1; number of reducers: 0
2018-10-16 17:23:57,040 Stage-0 map = 0%, reduce = 0%
2018-10-16 17:24:03,215 Stage-0 map = 100%, reduce = 0%, Cumulative CPU 4.31 sec
MapReduce Total cumulative CPU time: 4 seconds 310 msec
Ended Job = job_1519375199907_258597
MapReduce Jobs Launched:
Stage-Stage-0: Map: 1 Cumulative CPU: 4.31 sec HDFS Read: 7472 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 310 msec
OK
Time taken: 13.523 seconds 

2.8 查看 table_hive_xternal 的数据

 select * from table_hive_xternal;

 hive> select * from table_hive_xternal;
OK
221_铜锣湾2 12 2210 铜锣湾2 啥子字段 110 韩国大区 weq 13F1D05894 1 汉东省广中猴姑米西翻公司
375_铜锣湾234 20 3755 铜锣湾234 啥子字段 110 艾欧尼亚大区 weq 31E2F不知82 1 汉东省深中猴姑米西翻公司
458铜锣湾99 21 458 铜锣湾99 啥子字段 110 艾欧尼亚大区 weq 3C09D不知名B 11 汉东省肇中猴姑米西翻公司
475_铜锣湾2 13 4750 铜锣湾2 啥子字段 110 艾欧尼亚大区 weq 5F4E9不知C5 1 汉东省江中猴姑米西翻公司
626_0铜锣湾45 10 62630 铜锣湾45 啥子字段 110 艾欧尼亚大区 weq 1BA07不知名B 11 汉东省汕中猴姑米西翻公司
626_铜锣湾0 17 6263 铜锣湾0 啥子字段 110 瑞本大区 weq 9FF783FEE9 11 汉东省揭中猴姑米西翻公司
661_铜锣湾12 8 6618 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 5D0A9不知名E 11 汉东省茂中猴姑米西翻公司
667_铜锣湾4 14 6672 铜锣湾4 啥子字段 110 艾欧尼亚大区 weq CF19F不知名B 21 汉东省阳中猴姑米西翻公司
706_铜锣湾8 16 7062 铜锣湾8 啥子字段 110 艾欧尼亚大区 weq 51A88不知名8 11 汉东省河中猴姑米西翻公司
715铜锣湾12 11 715 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq 3A49A不知名7 11 汉东省湛中猴姑米西翻公司
723_铜锣湾3 2 7231 铜锣湾3 啥子字段 110 台湾大区 weq F8E9FCB7B1 11 汉东省清中猴姑米西翻公司
736_9铜锣湾1 1 73629 铜锣湾1 啥子字段 110 艾欧尼亚大区 weq 76D5A3D3EA4 1 汉东省东中猴姑米西翻公司
754_8铜锣湾7 5 75468 铜锣湾7 啥子字段 110 艾欧尼亚大区 weq 5B736不知名F 11 汉东省潮中猴姑米西翻公司
754_铜锣湾- 7 7542 铜锣湾- 啥子字段 110 艾欧尼亚大区 weq 246A1不知FC 1 汉东省惠中猴姑米西翻公司
754_铜锣湾32 9 7544 铜锣湾32 啥子字段 110 艾欧尼亚大区 weq 18D7A不知1E 1 汉东省汕中猴姑米西翻公司
754_铜锣湾9 6 7547 铜锣湾9 啥子字段 110 艾欧尼亚大区 weq EEA9F不知59 1 汉东省佛中猴姑米西翻公司
755_铜锣湾12 18 7553 铜锣湾12 啥子字段 110 艾欧尼亚大区 weq E9BE9不知名9 11 汉东省梅中猴姑米西翻公司
758_铜锣湾5 4 7586 铜锣湾5 啥子字段 110 黑莓尼亚大区 weq 507EB不知78 1 汉东省珠中猴姑米西翻公司
765_铜锣湾3 19 7651 铜锣湾3 啥子字段 110 德玛西亚尼亚大区 weq BD6F不6379 11 汉东省韶中猴姑米西翻公司
796_铜锣湾6 15 7966 铜锣湾6 啥子字段 110 艾欧尼亚大区 weq 9C9C0不知名4 21 汉东省云中猴姑米西翻公司
Time taken: 0.089 seconds, Fetched: 20 row(s)

2.9 查看HBase中 table_hive_xternal 的数据

 scan 'table_hive_xternal',{LIMIT=>2}
hbase(main):013:0> scan 'table_hive_xternal',{LIMIT=>2}
ROW COLUMN+CELL
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:area_code, timestamp=1539681842885, value=weq
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:bureau_id, timestamp=1539681842885, value=13F1D05894
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
\xE5\x85\xAC\xE5\x8F\xB8
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
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_id, timestamp=1539681842885, value=2210
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
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:dict_id, timestamp=1539681842885, value=12
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:group_id, timestamp=1539681842885, value=110
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
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:sort, timestamp=1539681842885, value=1
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:area_code, timestamp=1539681842885, value=weq
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:bureau_id, timestamp=1539681842885, value=31E2F\xE4\xB8\x8D\xE7\x9F\xA582
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
\xE5\x85\xAC\xE5\x8F\xB8
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
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_id, timestamp=1539681842885, value=3755
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
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:dict_id, timestamp=1539681842885, value=20
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:group_id, timestamp=1539681842885, value=110
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
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:sort, timestamp=1539681842885, value=1
2 row(s) in 0.0260 seconds
2.10 删除表
先删除hive表再查询Hbase
 //删除hive表
hive> show tables ;
OK
table_hive_xternal
table_hive_xternal_1
Time taken: 0.011 seconds, Fetched: 9 row(s)
hive> drop table table_hive_xternal;
OK
Time taken: 0.476 seconds
hive> show tables ;
OK
table_hive_xternal_1
Time taken: 0.01 seconds, Fetched: 8 row(s)
hive> //查询Hbase
hbase(main):014:0> scan 'table_hive_xternal',{LIMIT=>2}
ROW COLUMN+CELL
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:area_code, timestamp=1539681842885, value=weq
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:bureau_id, timestamp=1539681842885, value=13F1D05894
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
\xE5\x85\xAC\xE5\x8F\xB8
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
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:city_id, timestamp=1539681842885, value=2210
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
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:dict_id, timestamp=1539681842885, value=12
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:group_id, timestamp=1539681842885, value=110
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
221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2 column=info:sort, timestamp=1539681842885, value=1
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:area_code, timestamp=1539681842885, value=weq
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:bureau_id, timestamp=1539681842885, value=31E2F\xE4\xB8\x8D\xE7\x9F\xA582
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
\xE5\x85\xAC\xE5\x8F\xB8
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
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:city_id, timestamp=1539681842885, value=3755
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
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:dict_id, timestamp=1539681842885, value=20
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:group_id, timestamp=1539681842885, value=110
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
375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234 column=info:sort, timestamp=1539681842885, value=1
2 row(s) in 0.0200 seconds 
再走一次之前的流程把数据弄回来

先删除hbase 在查询Hive
 //删除hbase
hbase(main):018:0> disable 'table_hive_xternal'
0 row(s) in 2.2310 seconds hbase(main):019:0> drop 'table_hive_xternal'
0 row(s) in 1.2290 seconds //查询Hive
hive> select * from table_hive_xternal;
OK
Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_xternal
Time taken: 0.109 seconds 
2.3 Hive-Hbase 方式总结
2.3.1 管理表
  • Hbase 是否需要先建立
不需要,在创建table_hive_mange后HBase表会自动创建
  • 能否直接load数据到table_hive_mange
不能
 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange;
hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange;
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汇报下面的错误
 hive> create external table table_hive_xternal
> (key String,
> dict_id String,
> city_id String,
> city_name String,
> city_code String,
> group_id String,
> group_name String,
> area_code String,
> bureau_id String,
> sort String,
> bureau_name String)
> row format delimited
> fields terminated by '|'
> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
> info:dict_id,
> info:city_id,
> info:city_name,
> info:city_code,
> info:group_id,
> info:group_name,
> info:area_code,
> info:bureau_id,
> info:sort,
> info:bureau_name")
> TBLPROPERTIES("hbase.table.name" = "table_hive_xternal");
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.)
at org.apache.hadoop.hive.hbase.HBaseStorageHandler.preCreateTable(HBaseStorageHandler.java:215)
...... 
  • 能否直接load数据到table_hive_xternal
不能
 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal;
hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal;
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的信息我保存在了外部的配置文件,这样方便后续的配置添加。

 //配置文件示例:
[hdfs@iptve2e03 tmp_lillcol]$ cat job.properties
#mysql数据库配置
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://127.0.0.1:3306/database1?useSSL=false&autoReconnect=true&failOverReadOnly=false&rewriteBatchedStatements=true
mysql.username=user
mysql.password=

2.需要的jar依赖

sbt版本,maven的对应修改即可

 libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.0-cdh5.7.2"
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.0-cdh5.7.2"
libraryDependencies += "org.apache.spark" % "spark-hive_2.10" % "1.6.0-cdh5.7.2"
libraryDependencies += "org.apache.hbase" % "hbase-client" % "1.2.0-cdh5.7.2"
libraryDependencies += "org.apache.hbase" % "hbase-server" % "1.2.0-cdh5.7.2"
libraryDependencies += "org.apache.hbase" % "hbase-common" % "1.2.0-cdh5.7.2"
libraryDependencies += "org.apache.hbase" % "hbase-protocol" % "1.2.0-cdh5.7.2"
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.38"
libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.6.0-cdh5.7.2"
libraryDependencies += "com.yammer.metrics" % "metrics-core" % "2.2.0" 

3. 完整代码

 import java.io.FileInputStream
import java.util.Properties import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.hadoop.fs.permission.{FsAction, FsPermission}
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.{HBaseConfiguration, KeyValue}
import org.apache.hadoop.mapreduce.Job
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.functions.{concat, lit}
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.sql.{DataFrame, SQLContext}
import org.apache.spark.{SparkConf, SparkContext} /**
* @author 利伊奥克儿-lillcol
* 2018/10/14-11:08
*
*/
object TestHFile {
var hdfsPath: String = ""
var proPath: String = ""
var DATE: String = "" val sparkConf: SparkConf = new SparkConf().setAppName(getClass.getSimpleName)
val sc: SparkContext = new SparkContext(sparkConf)
val sqlContext: SQLContext = new HiveContext(sc) import sqlContext.implicits._ def main(args: Array[String]): Unit = {
hdfsPath = args(0)
proPath = args(1) //HFile保存路径
val save_path: String = hdfsPath + "TableTestHFile"
//获取测试DataFrame
val dim_sys_city_dict: DataFrame = readMysqlTable(sqlContext, "DIM_SYS_CITY_DICT", proPath) val resultDataFrame: DataFrame = dim_sys_city_dict
.select(concat($"city_id", lit("_"), $"city_name", lit("_"), $"city_code").as("key"), $"*")
//注:resultDataFrame 里面的 key 要放在第一位,因为后面需要对字段名排序
saveASHfFile(resultDataFrame, "cf_info", save_path)
} /**
* 将DataFrame 保存为 HFile
*
* @param resultDataFrame 需要保存为HFile的 DataFrame,DataFrame的第一个字段必须为"key"
* @param clounmFamily 列族名称(必须在Hbase中存在,否则在load数据的时候会失败)
* @param save_path HFile的保存路径
*/
def saveASHfFile(resultDataFrame: DataFrame, clounmFamily: String, save_path: String): Unit = {
val conf: Configuration = HBaseConfiguration.create()
lazy val job = Job.getInstance(conf)
job.setMapOutputKeyClass(classOf[ImmutableBytesWritable]) //设置MapOutput Key Value 的数据类型
job.setMapOutputValueClass(classOf[KeyValue]) var columnsName: Array[String] = resultDataFrame.columns //获取列名 第一个为key
columnsName = columnsName.drop(1).sorted //把key去掉 因为要排序 val result1: RDD[(ImmutableBytesWritable, Seq[KeyValue])] = resultDataFrame
.map(row => {
var kvlist: Seq[KeyValue] = List()
var rowkey: Array[Byte] = null
var cn: Array[Byte] = null
var v: Array[Byte] = null
var kv: KeyValue = null
val cf: Array[Byte] = clounmFamily.getBytes //列族
rowkey = Bytes.toBytes(row.getAs[String]("key")) //key
for (i <- 1 to (columnsName.length - 1)) {
cn = columnsName(i).getBytes() //列的名称
v = Bytes.toBytes(row.getAs[String](columnsName(i))) //列的值
//将rdd转换成HFile需要的格式,我们上面定义了Hfile的key是ImmutableBytesWritable,那么我们定义的RDD也是要以ImmutableBytesWritable的实例为key
kv = new KeyValue(rowkey, cf, cn, v) //封装一下 rowkey, cf, clounmVale, value
//
kvlist = kvlist :+ kv //将新的kv加在kvlist后面(不能反 需要整体有序)
}
(new ImmutableBytesWritable(rowkey), kvlist)
}) //RDD[(ImmutableBytesWritable, Seq[KeyValue])] 转换成 RDD[(ImmutableBytesWritable, KeyValue)]
val result: RDD[(ImmutableBytesWritable, KeyValue)] = result1.flatMapValues(s => {
s.iterator
}) delete_hdfspath(save_path) //删除save_path 原来的数据
//保存数据
result
.sortBy(x => x._1, true) //要保持 整体有序
.saveAsNewAPIHadoopFile(save_path,
classOf[ImmutableBytesWritable],
classOf[KeyValue],
classOf[HFileOutputFormat2],
job.getConfiguration) } /**
* 删除hdfs下的文件
*
* @param url 需要删除的路径
*/
def delete_hdfspath(url: String) {
val hdfs: FileSystem = FileSystem.get(new Configuration)
val path: Path = new Path(url)
if (hdfs.exists(path)) {
val filePermission = new FsPermission(FsAction.ALL, FsAction.ALL, FsAction.READ)
hdfs.delete(path, true)
}
} /**
* 获取 Mysql 表的数据
*
* @param sqlContext
* @param tableName 读取Mysql表的名字
* @param proPath 配置文件的路径
* @return 返回 Mysql 表的 DataFrame
*/
def readMysqlTable(sqlContext: SQLContext, tableName: String, proPath: String) = {
val properties: Properties = getProPerties(proPath)
sqlContext
.read
.format("jdbc")
.option("url", properties.getProperty("mysql.url"))
.option("driver", properties.getProperty("mysql.driver"))
.option("user", properties.getProperty("mysql.username"))
.option("password", properties.getProperty("mysql.password"))
// .option("dbtable", tableName.toUpperCase)
.option("dbtable", tableName)
.load() } /**
* 获取 Mysql 表的数据 添加过滤条件
*
* @param sqlContext
* @param table 读取Mysql表的名字
* @param filterCondition 过滤条件
* @param proPath 配置文件的路径
* @return 返回 Mysql 表的 DataFrame
*/
def readMysqlTable(sqlContext: SQLContext, table: String, filterCondition: String, proPath: String): DataFrame = {
val properties: Properties = getProPerties(proPath)
var tableName = ""
tableName = "(select * from " + table + " where " + filterCondition + " ) as t1"
sqlContext
.read
.format("jdbc")
.option("url", properties.getProperty("mysql.url"))
.option("driver", properties.getProperty("mysql.driver"))
.option("user", properties.getProperty("mysql.username"))
.option("password", properties.getProperty("mysql.password"))
.option("dbtable", tableName)
.load()
} /**
* 获取配置文件
*
* @param proPath
* @return
*/
def getProPerties(proPath: String): Properties = {
val properties: Properties = new Properties()
properties.load(new FileInputStream(proPath))
properties
}
}

4. 测试代码

 def main(args: Array[String]): Unit = {
hdfsPath = args(0)
proPath = args(1) //HFile保存路径
val save_path: String = hdfsPath + "TableTestHFile"
//获取测试DataFrame
val dim_sys_city_dict: DataFrame = readMysqlTable(sqlContext, "DIM_SYS_CITY_DICT", proPath) val resultDataFrame: DataFrame = dim_sys_city_dict
.select(concat($"city_id", lit("_"), $"city_name", lit("_"), $"city_code").as("key"), $"*")
//注:resultDataFrame 里面的 key 要放在第一位,因为后面需要对字段名排序
saveASHfFile(resultDataFrame, "cf_info", save_path)
}

5. 执行命令

 nohup spark-submit --master yarn \
--driver-memory 4G \
--num-executors 2 \
--executor-cores 4 \
--executor-memory 8G \
--class com.iptv.job.basedata.TestHFile \
--jars /var/lib/hadoop-hdfs/tmp_lillcol/mysql-connector-java-5.1.38.jar \
tygq.jar \
hdfs://ns1/user/hive/warehouse/ \
/var/lib/hadoop-hdfs/tmp_lillcol/job.properties > ./TestHFile.log 2>&1 &

6.执行结果

 [hdfs@iptve2e03 tmp_lillcol]$ hadoop fs -du -h hdfs://ns1/user/hive/warehouse/TableTestHFile
0 0 hdfs://ns1/user/hive/warehouse/TableTestHFile/_SUCCESS
12.3 K 24.5 K hdfs://ns1/user/hive/warehouse/TableTestHFile/cf_info

7. HFile load 进 Hbase

 hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://ns1/user/hive/warehouse/TableTestHFile iptv:spark_test

 .....
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
18/10/17 10:14:20 INFO client.ConnectionManager$HConnectionImplementation: Closing master protocol: MasterService
18/10/17 10:14:20 INFO client.ConnectionManager$HConnectionImplementation: Closing zookeeper sessionid=0x16604bba6872fff
18/10/17 10:14:20 INFO zookeeper.ClientCnxn: EventThread shut down
18/10/17 10:14:20 INFO zookeeper.ZooKeeper: Session: 0x16604bba6872fff closed

8.查看HBase中的数据

 hbase(main):005:0> scan 'iptv:spark_test',{LIMIT=>2}
ROW COLUMN+CELL
200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:bureau_id, timestamp=1539742949840, value=BF55
200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:bureau_name, timestamp=1539742949840, value=\x85\xAC\xE5
200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:city_code, timestamp=1539742949840, value=112
200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:city_id, timestamp=1539742949840, value=112
200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:city_name, timestamp=1539742949840, value=\xB7\x9E
200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:dict_id, timestamp=1539742949840, value=112
200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:group_id, timestamp=1539742949840, value=112
200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:group_name, timestamp=1539742949840, value=\x8C\xBA
200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ column=cf_info:sort, timestamp=1539742949840, value=112
660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:bureau_id, timestamp=1539742949840, value=6AA0EF0B
660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:bureau_name, timestamp=1539742949840, value=xE5\x8F\xB8
660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:city_code, timestamp=1539742949840, value=112
660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:city_id, timestamp=1539742949840, value=112
660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:city_name, timestamp=1539742949840, value=\xBE
660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:dict_id, timestamp=1539742949840, value=112
660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:group_id, timestamp=1539742949840, value=112
660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:group_name, timestamp=1539742949840, value=\x8C\xBA
660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW column=cf_info:sort, timestamp=1539742949840, value=112

9.总结

多列族,多列处理

通过算法将原本只能单个一个列族一个列处理的数据扩展到了多列族,多列处理。
实现的关键是下面的两段代码

 var columnsName: Array[String] = resultDataFrame.columns //获取列名 第一个为key
columnsName = columnsName.drop(1).sorted //把key去掉 因为要排序 val result1: RDD[(ImmutableBytesWritable, Seq[KeyValue])] = resultDataFrame
.map(row => {
var kvlist: Seq[KeyValue] = List()
var rowkey: Array[Byte] = null
var cn: Array[Byte] = null
var v: Array[Byte] = null
var kv: KeyValue = null
val cf: Array[Byte] = clounmFamily.getBytes //列族
rowkey = Bytes.toBytes(row.getAs[String]("key")) //key
for (i <- 1 to (columnsName.length - 1)) {
cn = columnsName(i).getBytes() //列的名称
v = Bytes.toBytes(row.getAs[String](columnsName(i))) //列的值
//将rdd转换成HFile需要的格式,我们上面定义了Hfile的key是ImmutableBytesWritable,那么我们定义的RDD也是要以ImmutableBytesWritable的实例为key
kv = new KeyValue(rowkey, cf, cn, v) //封装一下 rowkey, cf, clounmVale, value
//
kvlist = kvlist :+ kv //将新的kv加在kvlist后面(不能反 需要整体有序)
}
(new ImmutableBytesWritable(rowkey), kvlist)
}) //RDD[(ImmutableBytesWritable, Seq[KeyValue])] 转换成 RDD[(ImmutableBytesWritable, KeyValue)]
val result: RDD[(ImmutableBytesWritable, KeyValue)] = result1.flatMapValues(s => {
s.iterator
})

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

这个就不用说了,这个必须要整体有序,实现代码

 //保存数据
result
.sortBy(x => x._1, true) //要保持 整体有序
.saveAsNewAPIHadoopFile(save_path,
classOf[ImmutableBytesWritable],
classOf[KeyValue],
classOf[HFileOutputFormat2],
job.getConfiguration)
  • 列名
 //列名也要保持整体有序,实现代码
var columnsName: Array[String] = resultDataFrame.columns //获取列名 第一个为key;
columnsName = columnsName.drop(1).sorted //把key去掉 因为要排序

如果不排序 会出现下面的错误

 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.
Current cell = 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ/cf_info:area_code/1539584366048/Put/vlen=5/seqid=0,
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了

保存路径

保存的路径不能存在,那就删除呗

 /**
* 删除hdfs下的文件
*
* @param url 需要删除的路径
*/
def delete_hdfspath(url: String) {
val hdfs: FileSystem = FileSystem.get(new Configuration)
val path: Path = new Path(url)
if (hdfs.exists(path)) {
val filePermission = new FsPermission(FsAction.ALL, FsAction.ALL, FsAction.READ)
hdfs.delete(path, true)
}
}

列族名称

列族需要在Hbase中存在,列可以不存在

对比总结

Hive-Hbase

  • 优点:

关联Hive,容易对数据进行二次加工

操作相对简单,要求没那么高

可以轻易处理多列族多列问题

  • 缺点:

建立一张临时表,消耗空间增加一倍左右

load数据的时候很快,但是insert into的时候耗费时间与数据量相关

HFile

  • 优点:

Load数据很快

从头到尾产生的文件只有一个HFile,必两一种方式节省空间

  • 缺点:

数据很难二次加工,查询如果没有工具很不友好

对开发有一定的要求

至于两种方式如何选择,看需求。

此文为本人日常工作总结,转载请标明出处!!!!!!!



Spark:DataFrame批量导入Hbase的两种方式(HFile、Hive)的更多相关文章

  1. neo4j批量导入数据的两种解决方案

    neo4j批量导入数据有两种方法,第一种是使用cypher语法中的LOAD CSV,第二种是使用neo4j自带的工具neo4j-admin import. LOAD CSV 导入的文件必须是csv文件 ...

  2. Python3 动态导入模块的两种方式

    动态导入模块就是只知道str类型的模块名字符串,通过这个字符串导入模块 需要导入的模块: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:C ...

  3. python导入模块的两种方式

    第一种 from support import * 这种方式导入后可以直接调用(有命名冲突问题)命名冲突后定义的覆盖前定义的 如果在函数导入前定义 则导入函数覆盖 否则相反 if __name__ = ...

  4. android studio导入jar的两种方式

    一.第一种是打开工程所在Project Structure,然后选择Dependencies,点击那个加号选择File Dependency ,然后再Libs文件夹中选择要导入的jar包 1. 2. ...

  5. excel导入导出的两种方式:csv和XLS

    依赖 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>jxl ...

  6. 两种方式— 在hive SQL中传入参数

    第一种: sql = sql.format(dt=dt) 第二种: item_third_cate_cd_list = " 发发发 " ...... ""&qu ...

  7. ORACLE导入大量数据的两种方式比较

    不管是开发还是测试,工作中经常需要去批量新增测试数据,但是大量数据的新增速度有时候让我们苦不堪言,下面通过两种方式完成oracle数据的批量新增,比较两种方式的效率. 第一种方式:采用工具导入sql文 ...

  8. 1.11-1.12 Sqoop导入数据时两种增量方式导入及direct

    一.增量数据的导入 1.两种方式 ## query 有一个唯一标识符,通常这个表都有一个字段,类似于插入时间createtime where createtime => 201509240000 ...

  9. 编译spark源码 Maven 、SBT 2种方式编译

    由于实际环境较为复杂,从Spark官方下载二进制安装包可能不具有相关功能或不支持指定的软件版本,这就需要我们根据实际情况编译Spark源代码,生成所需要的部署包. Spark可以通过Maven和SBT ...

随机推荐

  1. login.html

    <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1 ...

  2. 【转】QT 添加外部库文件

    转自:Qt 添加外部库文件 LIBS += D:\Code\Opengltest\OpenGL32.Lib D:\Code\Opengltest\GlU32.Lib # 直接加绝对路径 LIBS += ...

  3. ajax 提交form格式 和 json格式

    json 格式 内容在body中 ajax设置   Content-Type: application/json 浏览器查看为 Request Payload The Request Payload ...

  4. oracle入门之对表数据查询(一)

    此文中用到的表是Scott用户中自带的三张表: 基本select语句 基本语法: select [distinct] *|{columnl,column2,column3..} from table ...

  5. seckill(1)秒杀系统主要步骤

  6. Linux的.pid文件

    PID全称是Process Identification. PID是进程的代号,每个进程有唯一的PID编号.它是进程运行时系统随机分配的,并不代表专门的进程.在运行时PID是不会改变标识符的,但是你终 ...

  7. vue2.0 添加监听滚动事件

    export default { data () { return { isFixed: true } }, mounted () { window.addEventListener('scroll' ...

  8. kaptcha生成java验证码

    kaptcha工作的原理是调用 com.google.code.kaptcha.servlet.KaptchaServlet,生成一个图片.同时将生成的验证码字符串放到 HttpSession中. 1 ...

  9. Linux "ls -l"文件列表权限详解 【转】

    1.使用 ls -l 命令 执行结果如下(/var/log) : drwxr-x--- 2 root              adm    4096 2013-08-07 11:03 apache2 ...

  10. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...