hive数据导入

本文介绍了四种将数据导入Hive表的方法:通过外部表导入、从本地导入数据、从HDFS导入以及从其他表导入数据,并提供了详细的步骤和示例。
转自:http://blog.youkuaiyun.com/yfkiss/article/details/7776406
可以通过多种方式将数据导入hive表
1.通过外部表导入
用户在hive上建external表,建表的同时指定hdfs路径,在数据拷贝到指定hdfs路径的同时,也同时完成数据插入external表。
例如:

编辑文件test.txt
$ cat test.txt
1 hello
2 world
3 test
4 case
字段之间以'\t'分割

启动hive:
$ hive

建external表:
hive> CREATE EXTERNAL TABLE MYTEST(num INT, name STRING)
> COMMENT 'this is a test'
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> STORED AS TEXTFILE
> LOCATION '/data/test';
OK
Time taken: 0.714 seconds
hive> show tables;
OK
mytest
partition_test
partition_test_input
test
Time taken: 0.07 seconds
hive> desc mytest ;
OK
num int
name string
Time taken: 0.121 seconds|

数据拷贝到hdfs:
$ hadoop fs -put test.txt /data/test

查看hive表数据:
hive> select * from mytest;
OK
1 hello
2 world
3 test
4 case
Time taken: 0.375 seconds
hive> select num from mytest;
Total MapReduce jobs = 1
Launching Job 1 out of 1
......
Total MapReduce CPU Time Spent: 510 msec
OK
1
2
3
4
Time taken: 27.157 seconds

这种方式常常用于当hdfs上有一些历史数据,而我们需要在这些数据上做一些hive的操作时使用。这种方式避免了数据拷贝开销

2.从本地导入
数据不在hdfs上,直接从本地导入hive表

文件/home/work/test.txt内容同上

建表:
hive> CREATE TABLE MYTEST2(num INT, name STRING)
> COMMENT 'this is a test2'
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> STORED AS TEXTFILE;
OK
Time taken: 0.077 seconds

导数据入表:
hive> LOAD DATA LOCAL INPATH '/home/work/test.txt' INTO TABLE MYTEST2;
Copying data from file:/home/work/test.txt
Copying file: file:/home/work/test.txt
Loading data to table default.mytest2
OK
Time taken: 0.24 seconds

查看数据:
hive> select * from MYTEST2;
OK
1 hello
2 world
3 test
4 case
Time taken: 0.11 seconds
这种方式导入的本地数据可以是一个文件,一个文件夹或者通配符,需要注意的是,如果是文件夹,文件夹内不能包含子目录,同样,通配符只能通配文件。

3.从hdfs导入
上述test.txt文件已经导入/data/test
则可以使用下述命令直接将数据导入hive表:
hive> CREATE TABLE MYTEST3(num INT, name STRING)
> COMMENT "this is a test3"
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> STORED AS TEXTFILE;
OK
Time taken: 4.735 seconds
hive> LOAD DATA INPATH '/data/test/test.txt' INTO TABLE MYTEST3;
Loading data to table default.mytest3
OK
Time taken: 0.337 seconds
hive> select * from MYTEST3 ;
OK
1 hello
2 world
3 test
4 case
Time taken: 0.227 seconds

4. 从其它表导入数据:
hive> CREATE EXTERNAL TABLE MYTEST4(num INT) ;
OK
Time taken: 0.091 seconds
hive> FROM MYTEST3 test3
> INSERT OVERWRITE TABLE MYTEST4
> select test3.num where name='world';
Total MapReduce jobs = 2
Launching Job 1 out of 2
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_201207230024_0002, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201207230024_0002
Kill Command = /home/work/hadoop/hadoop-1.0.3/libexec/../bin/hadoop job -Dmapred.job.tracker=localhost:9001 -kill job_201207230024_0002
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2012-07-23 18:59:02,365 Stage-1 map = 0%, reduce = 0%
2012-07-23 18:59:08,417 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 0.62 sec
2012-07-23 18:59:09,435 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 0.62 sec
2012-07-23 18:59:10,445 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 0.62 sec
2012-07-23 18:59:11,455 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 0.62 sec
2012-07-23 18:59:12,470 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 0.62 sec
2012-07-23 18:59:13,489 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 0.62 sec
2012-07-23 18:59:14,508 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 0.62 sec
MapReduce Total cumulative CPU time: 620 msec
Ended Job = job_201207230024_0002
Ended Job = -174856900, job is filtered out (removed at runtime).
Moving data to: hdfs://localhost:9000/tmp/hive-work/hive_2012-07-23_18-58-44_166_189728317691010041/-ext-10000
Loading data to table default.mytest4
Deleted hdfs://localhost:9000/user/hive/warehouse/mytest4
Table default.mytest4 stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 2, raw_data_size: 0]
1 Rows loaded to mytest4
MapReduce Jobs Launched:
Job 0: Map: 1 Accumulative CPU: 0.62 sec HDFS Read: 242 HDFS Write: 2 SUCESS
Total MapReduce CPU Time Spent: 620 msec
OK
Time taken: 30.663 seconds
hive> select * from mytest4;
OK
2
Time taken: 0.103 seconds
<think> 我们参考了用户提供的引用内容,这些引用描述了将Hive数据导入HBase的几种方法。根据引用,主要有以下几种方式: 1. 逐条插入:使用Hive API或HBase API,逐条读取Hive数据并写入HBase(通过Put操作)。 2. BulkLoad方式:利用MapReduce生成HFile文件,然后批量加载到HBase表中,这种方式适合大批量数据导入。 3. 使用Hive自带的HBaseStorageHandler:在Hive中创建表时指定存储处理器为HBase,这样数据可以直接写入HBase表。 下面将详细介绍这三种方法。 ### 方法1:逐条插入(适合小数据量) 这种方法适用于数据量不大的情况。基本步骤: 1. 从Hive表中读取数据(可以通过Hive JDBC或HiveContext等)。 2. 对于每一行数据,构造HBase Put对象。 3. 通过HBase的Table对象将数据写入。 示例代码(Java): ```java // 假设已经获取了Hive表中的数据,这里用ResultSet模拟 ResultSet resultSet = ...; // 执行Hive查询得到的结果集 Configuration config = HBaseConfiguration.create(); try (Connection connection = ConnectionFactory.createConnection(config); Table table = connection.getTable(TableName.valueOf("hbase_table"))) { while (resultSet.next()) { // 从resultSet中读取每一列 String rowKey = resultSet.getString("rowkey_column"); Put put = new Put(Bytes.toBytes(rowKey)); // 添加列族、列、值 put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("col1"), Bytes.toBytes(resultSet.getString("col1"))); // ... 添加其他列 table.put(put); } } ``` 注意:这种方式效率较低,因为每条数据都要进行RPC调用,不适合大数据量。 ### 方法2:BulkLoad方式(适合大数据量) 这种方式利用MapReduce作业将Hive数据转换为HBase的HFile文件,然后将HFile文件加载到HBase表中。步骤: 1. 运行MapReduce作业,读取Hive数据(通常Hive数据存储在HDFS上),并生成HFile文件。 2. 使用HBase的`LoadIncrementalHFiles`工具将HFile文件加载到HBase表中。 示例步骤: 1. 编写MapReduce程序,设置输出格式为HFileOutputFormat2。 2. 在Driver类中配置作业,并设置输出路径。 3. 运行作业生成HFile。 4. 使用以下命令加载HFile: ```bash hadoop jar $HBASE_HOME/lib/hbase-mapreduce-*.jar completebulkload <hdfs_path_to_hfile> <hbase_table_name> ``` 引用[2]中提到,可以通过MapReduce读取Hive数据(即HDFS上的文件),然后生成HFile,最后批量导入。 ### 方法3:使用Hive的HBaseStorageHandler(直接映射) 这种方法是在Hive中创建外部表,该表映射到HBase表,这样在Hive中插入数据时,数据会直接写入HBase。 步骤(如引用[3]所示): 1. 将HBase相关的JAR包复制到Hive的lib目录下(注意版本兼容)。 2. 在Hive的配置文件hive-site.xml中配置ZooKeeper的相关属性(hive.zookeeper.quorum和hive.zookeeper.client.port)。 3. 在Hive中创建表,指定存储处理器并设置映射关系。 示例Hive建表语句: ```sql CREATE TABLE hive_hbase_emp_table( empno int, ename string, job string, mgr int, hiredate string, sal double, comm double, deptno int ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno" ) TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table"); ``` 这样,当向Hive表`hive_hbase_emp_table`插入数据时,数据也会被写入到HBase表`hbase_emp_table`中。 注意:这种方法要求Hive表的结构与HBase表的结构有明确的映射关系。 ### 总结 - 小数据量:可以使用逐条插入的方式。 - 大数据量:推荐使用BulkLoad方式,效率高,不经过HBase的写路径(不写WAL,不触发MemStore刷新等)。 - 实时同步或结构映射:可以使用Hive的HBaseStorageHandler,但需要注意版本兼容性和映射配置。 根据实际场景选择合适的方法。 §§相关问题§§ 1. Hive和HBase的版本兼容性问题如何解决? 2. BulkLoad方式的具体步骤和注意事项有哪些? 3. 使用HBaseStorageHandler时,Hive表与HBase表的列映射规则是什么? 4. 如何监控Hive数据导入HBase的进度和状态? </think> ### 将Hive数据导入HBase的方法 根据引用内容,主要有三种方式实现Hive数据导入HBase,具体如下: --- #### 方法1:**逐条API插入**(适合小数据量实时写入) **步骤**: 1. 通过Hive API读取数据 2. 使用HBase的`Put`操作逐行写入 ```java // 示例代码框架 Table table = connection.getTable(TableName.valueOf("table_name")); Put put = new Put(Bytes.toBytes(rowKey)); put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("col"), Bytes.toBytes(value)); table.put(put); ``` **特点**: - 实现简单,适合少量数据实时同步 - 性能较差(每次RPC调用) - 可能触发Region Split(高并发时) --- #### 方法2:**BulkLoad批量导入**(推荐大数据量场景)[^2] **原理**:生成HBase内部格式(HFile)后直接加载到HDFS **步骤**: 1. 将Hive表导出为HDFS文件(需CSV格式) 2. 使用MapReduce生成HFile ```bash hadoop jar $HBASE_HOME/lib/hbase-mapreduce-*.jar \ importtsv \ -Dimporttsv.separator=, \ -Dimporttsv.columns="HBASE_ROW_KEY,cf:col1,cf:col2" \ -Dimporttsv.bulk.output=/hfile/output \ <hbase_table> \ /hive/export/data.csv ``` 3. 加载HFile到HBase ```bash hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \ /hfile/output <hbase_table> ``` **优势**: - 避免RegionServer写入压力 - 速度提升5-10倍(实测TB级数据) - 不写WAL日志 --- #### 方法3:**Hive-HBase直连映射**(结构映射)[^3] **步骤**: 1. **复制依赖包**(关键步骤) ```bash cp $HBASE_HOME/lib/{hbase-*,hadoop*.jar} $HIVE_HOME/lib/ ``` 2. **修改hive-site.xml** ```xml <property> <name>hive.zookeeper.quorum</name> <value>node1,node2,node3</value> </property> <property> <name>hive.zookeeper.client.port</name> <value>2181</value> </property> ``` 3. **创建映射表** ```sql CREATE EXTERNAL TABLE hive_hbase_table ( key int, col1 string, col2 double ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping" = ":key,cf:col1,cf:col2" ) TBLPROPERTIES ("hbase.table.name" = "hbase_table"); ``` 4. **数据自动同步**(写入Hive表即写入HBase) --- ### 方法对比 | 方法 | 数据量 | 性能 | 复杂度 | 实时性 | |------------|-----------|--------|--------|--------| | 逐条插入 | <100万行 | ★☆☆☆☆ | ★★☆☆☆ | 实时 | | BulkLoad | >千万行 | ★★★★★ | ★★★★☆ | 离线 | | 直连映射 | 任意规模 | ★★★☆☆ | ★★☆☆☆ | 准实时 | > **最佳实践建议**: > - 增量数据:使用方法1(API插入) > - 全量迁移:优先BulkLoad(方法2) > - 长期同步:建立直连映射(方法3)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值