hive中的数据导入到hdfs或者本地文件的方式包括sqoop

把hive中的数据导入到hdfs或者本地文件的方式

1、通过insert…directory方式导出数据到本地文件

 insert overwrite local directory '/opt/datas/hive/exp_hive'
 select * from emp ;

 insert overwrite local directory '/opt/datas/hive/exp_hive2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select * from emp ;

2、加载数据到hdfs

insert overwrite directory '/user/senior/hive/exp_hive'
select * from emp ;

3、通过hive 命令 + grep| > 加载数据到本地

bin/hive -e 'select * from db_hive_0927.emp ;'

bin/hive -e 'select * from db_hive_0927.emp ;' >> /opt/datas/exp_emp 

4、通过hadoop命令加载数据

hdfs dfs  -get   /user/hive/warehouse/a.txt  /root/aa

5、可以通过sqoop工具

运行环境 centos 5.6 hadoop hive
sqoop是让hadoop技术支持的clouder公司开发的一个在关系数据库和hdfs,hive之间数据导入导出的一个工具。

在使用过程中可能遇到的问题:

sqoop依赖zookeeper,所以必须配置ZOOKEEPER_HOME到环境变量中。
sqoop-1.2.0-CDH3B4依赖hadoop-core-0.20.2-CDH3B4.jar,所以你需要下载hadoop-0.20.2-CDH3B4.tar.gz,解压缩后将hadoop-0.20.2-CDH3B4/hadoop-core-0.20.2-CDH3B4.jar复制到sqoop-1.2.0-CDH3B4/lib中。
1 首先安装sqoop,如果你使用的是clouder分发版的话就非常简单
#yum install sqoop
如果用官方版本的话
#cd /etc/yum.repos.d
#wget http://archive.cloudera.com/redhat/cdh/cloudera-cdh3.repo
#yum -y install sqoop
sqoop就会安装完成
2 使用sqoop
首先将mysql-connector-java-5.1.16-bin.jar文件复制到/usr/lib/sqoop/lib文件夹下

3 导入导出数据库
1)列出mysql数据库中的所有数据库命令
#sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456

2)连接mysql并列出数据库中的表命令
#sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username root --password 123456
命令中的test为mysql数据库中的test数据库名称 username password分别为mysql数据库的用户密码

3)将关系型数据的表结构复制到hive中
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --table username --username root --password 123456 --hive-table test
其中 --table username为mysql中的数据库test中的表 --hive-table test 为hive中新建的表名称

4)从关系数据库导入文件到hive中
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password mysql-password --table t1 --hive-import

5)将hive中的表数据导入到mysql中

./sqoop export --connect jdbc:mysql://localhost:3306/test --username root --password admin --table uv_info --export-dir /user/hive/warehouse/uv/dt=2011-08-03

如果报错
11/08/05 10:51:22 INFO mapred.JobClient: Running job: job_201108051007_0010
11/08/05 10:51:23 INFO mapred.JobClient: map 0% reduce 0%
11/08/05 10:51:36 INFO mapred.JobClient: Task Id : attempt_201108051007_0010_m_000000_0, Status : FAILED
java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(AbstractList.java:350)
at uv_info.__loadFromFields(uv_info.java:194)
at uv_info.parse(uv_info.java:143)
at com.cloudera.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:79)
at com.cloudera.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:38)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
at com.cloudera.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:187)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:647)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323)
at org.apache.hadoop.mapred.Child$4.run(Child.java:270)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127)
at org.apache.hadoop.mapred.Child.main(Child.java:264)
此错误的原因为sqoop解析文件的字段与MySql数据库的表的字段对应不上造成的。因此需要在执行的时候给sqoop增加参数,告诉sqoop文件的分隔符,使它能够正确的解析文件字段。

hive默认的字段分隔符为’\001’
./sqoop export --connect jdbc:mysql://localhost:3306/datacenter --username root --password admin --table uv_info --export-dir /user/hive/warehouse/uv/dt=2011-08-03 --input-fields-terminated-by ‘\t’

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HDFS数据导入Hive可以通过以下两种方式实现: 1. 使用Hive的LOAD DATA命令 首先将数据文件上传到HDFS,然后使用Hive的LOAD DATA命令将数据导入Hive。LOAD DATA命令的语法如下: ``` LOAD DATA [LOCAL] INPATH 'hdfs_path' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] ``` 其hdfs_path是数据文件HDFS的路径,tablename是要导入数据Hive表名。如果数据文件的字段与Hive表的字段不匹配,则需要指定字段的分隔符和行分隔符。 2. 使用Hive的EXTERNAL TABLE 如果数据文件已经存在于HDFS,可以使用Hive的EXTERNAL TABLE将数据文件映射为Hive表。EXTERNAL TABLE与普通表不同的是,它只是对HDFS数据文件的一个元数据描述,不会将数据复制到Hive数据仓库。使用EXTERNAL TABLE的语法如下: ``` CREATE EXTERNAL TABLE tablename (col1 type1, col2 type2, ...) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' LOCATION 'hdfs_path'; ``` 其hdfs_path是数据文件HDFS的路径,col1、col2等是Hive表的列名和类型。如果数据文件的字段与Hive表的字段不匹配,则需要指定字段的分隔符和行分隔符。 总体来说,使用LOAD DATA命令比使用EXTERNAL TABLE更简单,但是需要将数据文件上传到HDFS。而使用EXTERNAL TABLE则可以直接使用HDFS数据文件,但是需要手动创建表和指定分隔符和行分隔符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值