我是靠谱客的博主 专一雪糕,最近开发中收集的这篇文章主要介绍sqoop导入操作(全)及遇到的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

sqoop导入操作(全)及遇到的问题

一、sqoop 全量导入

1、mysql->hive
(1)语句总结:
sqoop import --connect jdbc:mysql://$hostname:$port/$datebase_name  #mysql数据库的连接
--username ***  --password *** 
--table $table_name                           #这里指mysql的表名
#--query "sel.. where 条件 and $CONDITIONS"   #如果条件抽取的话用这个条件,最后的conditions一定要带
-m 1                                          #-m 1 表示启动一个MR程序(默认是4个)
#--split-by id                               #数据切片字段,m>1时必须指定
--delete-target-dir                 
--hive-drop-import-delims                    #删除数据中含有的默认的分隔符
#--fields-terminated-by t                   #这个用来指定数据行的分隔符号
#--lines-terminated-by 'n'                  #用来指定数据行间的分隔符
#--compression-codec lzo                     #用来指定数据表的压缩格式
--hive-import                       
--hive-overwrite                    
--null-string '\N'                          #string类型的字段如果是NULL的话替换成指定字符\N
--null-non-string '\N'                      #非string类型的字段如果是NULL的话替换成指定字符\N
#–hive-partition-key db                      #指定导入Hive的分区字段
#–hive-partition-value $database             #指定导入Hive的哪个分区
--hive-table $table_name                     #这里是hive里面的表名
--hive-database ods                           #这里是hive里面的数据库名称
(2)遇到问题总结:

​ ①mysql和hive的数据量不一样:

​ 原因:导入的数据默认的列分隔符是'01',默认的行分隔符是'n';如果数据里面有分隔符就会默认换行了,数量就会变多

​ 这个网上的解决方案很多,试了很多种;最后我自己试的有效的就是把下面这个加上;把导入数据中包含的hive的默认分隔符去掉;

--hive-drop-import-delims    

​ ②mysql里面的is null数据到hive里面都变成了null字符串,导致列的类型都变成了string:

​ 原因:hive当中默认对于null的处理是按照n的方式进行处理的

​ 增加下面两行:

--null-string '\N'                 
--null-non-string '\N' 

​ ③这样mysql->hive的话如果mysql的表结构发生变化的话,hive里面的表结构是不会自动变化的:

​ 手动删除hive的表和生成的.java文件,然后重新sqoop导入即可;

2、mysql->hdfs->hive
(1)语句总结:
#!/usr/bin/env bash
#将数据导入到hdfs(这里和上面的差不多,也可以table替换掉query)
sqoop import --connect jdbc:mysql://$hostname:$port/$database_name 
--username *** --password *** 
--query 'SELECT ... WHERE $CONDITIONS'                
--split-by id 
--fields-terminated-by "t" 
--target-dir /user/hadoop-user/moviele/movie 
--delete-target-dir

#将HDFS中的数据导入到Hive表中(以parquet的方式存储)
hive -f /home/hadoop-user/movie.sql
--这个是上面代码块执行的sql语句,/home/hadoop-user/movie.sql
CREATE DATABASE IF NOT EXISTS $database_name   --如果不存在数据库则进行创建

CREATE TABLE IF NOT EXISTS $table_name(...)   --创建hive表 
STORED AS PARQUET;

CREATE EXTERNAL TABLE IF NOT EXISTS $table_name_temp(...)   --创建临时表,存储位置对应数据的hdfs目录
LOCATION '/user/hadoop-user/moviele/movie';

INSERT OVERWRITE TABLE $table_name SELECT * FROM $table_name_temp;  --插入数据到hive表里面

DROP TABLE $table_name_temp   --删掉临时表
quit;
(2)遇到问题总结:可以参考mysql->hive的问题处理

二、sqoop增量导入

1、sqoop增量导入(根据column)
sqoop import 
   --connect jdbc:mysql://$hostname:3316/$database_name 
   --username *** 
   --password *** 
   --query “select ... where $CONDITIONS” 
   --target-dir /user/root/***  
   --split-by id1 
   -m 6  
   --incremental append 
   --check-column id 
   --last-value 123456
2、sqoop增量导入(sqoop job的形式)
#!/usr/bin/env bash
## 启动metastore
sqoop metastore &

## 删除已经存在的sqoop job
sqoop job --delete $sqoop_job_name --meta-connect jdbc:hsqldb:hsql://$hostname:16000/sqoop

## 创建一个sqoop job
## 增量的将的数据从mysql中导入到hdfs中
sqoop job --create $sqoop_job_name 
--meta-connect jdbc:hsqldb:hsql://$hostname:16000/sqoop   #这里的host是指执行的主机ip
-- import --connect jdbc:mysql://$hostname:$port/$database_name      
--username *** --password-file /user/hive/warehouse/***.pwd 
-m 1 
--incremental lastmodified --check-column time 
--table $table_name        #这里指mysql的表名
--fields-terminated-by "t" 
--target-dir /user/mysql_importdata/ods/***   #这里指数据导入的路径

## 执行sqoop导入任务      
sqoop job --exec $sqoop_job_name --meta-connect jdbc:hsqldb:hsql://$hostname:16000/sqoop

##!!!后面每次执行的时候只需要执行最后一行执行job的语句就可以了。会增量的把数据导入hdfs

备注补充:一般情况下为了安全在脚本里面不使用密码,而是把密码放到文件里面进行读取;

​ 且在使用sqoop job的时候如果使用–password会出现警告,并且需要手输入密码才可以执行;sqoop规定密码必须在hdfs上,且权限必须是400;创建密码文件的参考语句:

echo -n "123456" > ***.pwd
hdfs dfs -put ***.pwd /user/hive/warehouse
hdfs dfs -chmod 400 /user/hive/warehouse/***.pwd

最后

以上就是专一雪糕为你收集整理的sqoop导入操作(全)及遇到的问题的全部内容,希望文章能够帮你解决sqoop导入操作(全)及遇到的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部