大数据全系列 教程
1869个小节阅读:466.7k
408考研
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
Hive建立外部表要求hbase中必须有表对应,否则抛错。
实战演示:
hive中创建外部表
xxxxxxxxxx
hive> create external table tmp_order
(key string, id string, user_id string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ("hbase.columns.mapping" = ":key,order:order_id,order:user_id")
tblproperties ("hbase.table.name" = "t_order");
执行后出现如下错误提示:
xxxxxxxxxx
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:MetaException(message:HBase table t_order doesn't exist while the table is declared as an external table.)
在hbase中创建表t_order
xxxxxxxxxx
hbase(main):011:0> create 't_order', 'order'
Created table t_order
Took 1.5292 seconds => Hbase::Table - t_order
在hive中再次创建外部表
xxxxxxxxxx
hive> create external table tmp_order
(key string, id string, user_id string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ("hbase.columns.mapping" = ":key,order:order_id,order:user_id")
tblproperties ("hbase.table.name" = "t_order");
OK
Time taken: 0.75 seconds
hive> show tables;
......
tmp_order
......
hbase中添加数据
xxxxxxxxxx
hbase(main):012:0> put 't_order','1001','order:order_id','1'
Took 0.2973 seconds hbase(main):013:0> put 't_order','1001','order:user_id','101'
Took 0.0351 seconds hbase(main):014:0> scan 't_order'
ROW COLUMN+CELL 1001 column=order:order_id, timestamp=1639627170166, value=1 1001 column=order:user_id, timestamp=1639627187061, value=101 1 row(s)
Took 0.0867 seconds
hive中查询
xxxxxxxxxx
hive> select * from tmp_order;
OK
tmp_order.key tmp_order.id tmp_order.user_id
1001 1 101
Time taken: 0.505 seconds, Fetched: 1 row(s)
hive中插入数据,并查询
xxxxxxxxxx
hive> insert into tmp_order values('1002','2','102');
Query ID = root_20211216120352_3936294a-6476-4d38-836b-387634d30f4d
Total jobs = 1
Launching Job 1 out of 1
OK
_col0 _col1 _col2
Time taken: 37.191 seconds
hive> select * from tmp_order;
OK
tmp_order.key tmp_order.id tmp_order.user_id
1001 1 101
1002 2 102
Time taken: 0.419 seconds, Fetched: 2 row(s)
hbase中查询
xxxxxxxxxx
hbase(main):015:0> scan 't_order'
ROW COLUMN+CELL 1001 column=order:order_id, timestamp=1639627170166, value=1 1001 column=order:user_id, timestamp=1639627187061, value=101 1002 column=order:order_id, timestamp=1639627466260, value=2 1002 column=order:user_id, timestamp=1639627466260, value=102 2 row(s)
Took 0.0386 seconds
思考:数据到底保存到hive的表中还是hbase的表中?
测试步骤如下:
访问HDFS的WebUI界面查看
hive的查询,根据Active NameNode所在的节点进行选择:
http://node1:9870/explorer.html#/user/hive_remote/warehouse/tmp_order 或者:
http://node2:9870/explorer.html#/user/hive_remote/warehouse/tmp_order
hbase的查询,根据Active NameNode所在的节点进行选择:
或者:
注意:b87c2adcf357caf1b1ec5fbb50156bcc每个人的都可能不同,最好的办法是先访问到表路径,然后进行选择进入。
结果发现以上两个地方都没有数据
在hbase中刷新表
xxxxxxxxxx
hbase(main):017:0> flush 't_order'
Took 1.2423 seconds
然后在刷新1中的页面进行查看,发现只用hbase的表下面有数据文件,说明hive和hbase整合时,内部表关联的数据在hbase中保存。
总结:
创建hive的内部表,要求hbase中不能有对应的表
创建hive的外部表,要求hbase中一定要有对应的表
映射关系通过with serdeproperties ("hbase.columns.mapping" = ":key,cf:id,cf:username,cf:age")
stored by指定hive中存储数据的时候,由该类来处理,该类会将数据放到hbase的存储中,同时在hive读取数据的时候,由该类负责处理hbase的数据和hive的对应关系
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
指定hive表和hbase中的哪张表对应,outputtable负责当hive insert数据的时候将数据写到hbase的哪张表。
tblproperties ("hbase.table.name" = "my_table", "hbase.mapred.output.outputtable" = "my_table");
如果hbase中的表名和hive中的表名一致,则可以不指定tblproperties。
实时反馈
1. hbase整合hive后,关于hive与hbase有映射关系的外部表相关的描述,错误的是?
A 创建hive的外部表,要求hbase中不能有对应的表,否则报错。
B 数据既可以在hive端进行添加,也可以在hbase端进行添加。
C 数据在hive端可以通过insert直接向与hbase有映射关系的表中添加数据。
D 创建hive的外部表,要求hbase中有对应的表,否则报错。
2. hbase整合hive后,关于hive与hbase有映射关系的外部表数据的存储位置,正确的是?说明hive表创建时使用STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
A 数据保存在hive的表中。
B 数据保存在hbase的表中。
C 数据保存在hive、hbase的表中都保存。
答案:
1.A 2.B
实操