准备测试数据
应用场景:
使用sqoop上传字典表数据到hive中与我们的数据进行关联查询。
以 商品表 为例:
-- 创建sqoop_db 数据库
create database sqoop_db default charset utf8 collate utf8_general_ci;
-- 导入SQL文件
mysql -uroot -p sqoop_db < /public/data/goods_table.sql
eval 查看 sql 查询结果
# 没有where条件
sqoop eval \
--connect jdbc:mysql://nn1:3306/sqoop_db \
--username root \
--password 12345678 \
--query "select * from goods_table limit 10"
create-hive-table创建hive表
先启动hadoop集群
# 基于MySQL表创建hive表
sqoop create-hive-table \
--connect jdbc:mysql://nn1:3306/sqoop_db \
--username root \
--password 12345678 \
--table goods_table \
--hive-table hainiu.goods_table
报错:
修改sqoop配置文件
mv sqoop-env-template.sh sqoop-env.sh
添加hadoop,hive,hbase等环境信息
export ZOOKEEPER_HOME=/usr/local/zookeeper
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export HIVE_CONF_DIR=/usr/local/hive/conf
将hive-common-3.1.3.jar拷贝到sqoop的lib目录下
cp /usr/local/hive/lib/hive-common-3.1.3.jar /usr/local/sqoop/lib
测试:
查看hive表是否创建成功
多map条件查询导入HDFS
语法 :
sqoop import \
--connect 数据库连接字符串 \
--username 数据库用户名 \
--password 数据库密码 \
--target-dir HDFS位置 \
--delete-target-dir \
--fields-terminated-by "\t" \
--num-mappers 3 \
--split-by 切分数据依据 \
--query 'select SQL where 查询条件 and $CONDITIONS'
参数解释 :
–query或–e 将查询结果的数据导入,使用时必须伴随参–target-dir,–hive-table,如果查询中有where条件,则条件后必须加上$CONDITIONS关键字
当sqoop使用–query+sql执行多个maptask并行运行导入数据时,每个maptask将执行一部分数据的导入,原始数据需要使用’–split-by 某个字段’来切分数据,不同的数据交给不同的maptask去处理。maptask执行sql副本时,需要在where条件中添加$CONDITIONS条件,这个是linux系统的变量,可以根据sqoop对边界条件的判断,来替换成不同的值,这就是说若split-by id,则sqoop会判断id的最小值和最大值判断id的整体区间,然后根据maptask的个数来进行区间拆分,每个maptask执行一定id区间范围的数值导入任务,如下为示意图。
导入文本文件
#用hainiu认证
sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--target-dir /user/hainiu/sqoop/data/goods_1 \
--delete-target-dir \
--fields-terminated-by "\001" \
--num-mappers 4 \
--split-by id \
--query 'select * from goods_table where id < 10 and $CONDITIONS'
# 注意:
# --split-by: 一般都是数值型。
# -Dorg.apache.sqoop.splitter.allow_text_splitter=true: --split-by的是字符串也可以
查询结果 :
导入其他格式文件
# 导入不同格式,支持格式as-avrodatafile、as-parquetfile、as-sequencefile、as-textfile(默认格式)
# 多次导入时会报jar包已存在错误,请忽略,原因为sqoop读取源数据的schema文件创建的jar在前几次任务中已经创建了。
sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--target-dir /user/hainiu/sqoop/data/goods_2_parquet \
--delete-target-dir \
--as-parquetfile \
--num-mappers 4 \
--split-by id \
--query 'select * from goods_table where id < 10 and $CONDITIONS'
结果:
e-target-dir
–as-parquetfile
–num-mappers 4
–split-by id
–query ‘select * from goods_table where id < 10 and $CONDITIONS’
结果:
![file](https://img-blog.csdnimg.cn/img_convert/ae811dee584f3ae69f25de3e258e5ca3.png)