sqoop从mysql导入hive

sqoop从mysql导出到Hive

字段名如果是中文,必须 AS成字母。
自带主键的表(比如id),不需要--split-by参数,否则指定一个整数类型的字段名。
-m 参数指定mapper的个数,根据需要参考(文件大小/blocksize)来设置,比如32G/128M=256个。

一、导入全量数据
sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" --connect jdbc:mysql://addr.yun.com:3306/db_name?charset=utf-8 --username user_dev --password *** --table dw_zy_data_status --fields-terminated-by "\t" --direct -m 8 --hive-import --create-hive-table --hive-table dw_zy_data_status

去掉 --hive-overwrite变成增量导入:

sqoop import --connect jdbc:mysql://addr.yun.com:3306/db_test --username user_dev --password *** --query "SELECT user_id, 客户端 as client, 客户端分类 as client_type, 版本 as client_version, 是否用户点击 as is_click FROM tb_click WHERE 日期 >= '2018-07-01 00:00:00' AND 日期 < '2019-01-01 00:00:00'  AND \$CONDITIONS" --hive-import -m 16 --split-by user_id --target-dir /user/hadoop/sqoop/tb_click_tmp --delete-target-dir --hive-database ods --hive-table tb_click_tmp --hive-drop-import-delims --null-string '\\N' --null-non-string '\\N' --fields-terminated-by '\t'

// 导入18年下半年的。

二、导入增量数据

1,--incremental append 方式
sqoop import --connect jdbc:mysql://addr.yun.com:3306/db_name?charset=utf-8 --username user_dev --password *** --table dw_zy_data_log --fields-terminated-by "\t" -m 4 --hive-import --hive-table dw_zy_data_log --incremental append --check-column log_id --last-value 124382074

每次要记录last-value

2,--incremental lastmodified  --append
把大于last-value时间的数据都导入进来,之前就存在但是后期修改过的数据并不会进行合并,只会当做新增的数据加进来,
所以使用--incremental lastmodified  --append有可能导致数据重复的问题.

3,--incremental lastmodified  --merge-key
更新mysql数据:
UPDATE test_tow_type SET carg_type='六线new' WHERE id=8;
UPDATE test_tow_type SET carg_type='三线new' WHERE id=43;

报错:incremental lastmodified option for hive imports is not supported
--hive-import --hive-table test_tow_type 改为--target-dir "/user/hive/warehouse/test_tow_type"
执行:

sqoop import --connect jdbc:mysql://addr.yun.com:3306/db_name?charset=utf-8 --username user_dev --password *** --table test_tow_type --fields-terminated-by "\t" --target-dir "/user/hive/warehouse/test_tow_type" --incremental lastmodified --check-column update_time --last-value "2018-03-13 15:03:31" -m 1 --merge-key id

然后查看结果:
hive -e "select * from test_tow_type order by id;"
成功更新

4, create job 失败解决
https://blog.csdn.net/xianjie0318/article/details/79295183

wget http://www.java2s.com/Code/JarDownload/java-json/java-json.jar.zip
sudo mv java-json.jar /opt/apps/sqoop/1.4.7-1.0.0/package/sqoop-1.4.7-1.0.0/lib

sqoop job --create sqp_job_zy_log -- import --connect jdbc:mysql://addr.yun.com:3306/db_name?charset=utf-8 --username user_dev --password *** --table dw_zy_data_log --fields-terminated-by '\t' -m 4 --hive-import --hive-table dw_zy_data_log  --incremental append --check-column log_id --last-value 124605176

[注意是-- import不是--import, sqp_job_zy_log是job名]

查看:
sqoop job --list
执行:
sqoop job --exec sqp_job_zy_log
需手动输入密码。

5,create job 使用password-file
echo -n "***" > /opt/apps/sqoop/sqp_db.pwd
chown hadoop:hadoop sqp_db.pwd
chmod 600 sqp_db.pwd

echo不加-n报错:
java.sql.SQLException: Access denied for user 'root@xxx' (using password: YES)
测试password-file:
sqoop list-databases --connect jdbc:mysql://addr.yun.com:3306/db_name?charset=utf-8 --username user_dev --password-file file:///opt/apps/sqoop/sqp_db.pwd

使用password-file创建job:

sqoop job --create sqp_zy_log -- import --connect jdbc:mysql://addr.yun.com:3306/db_name?charset=utf-8 --username user_dev --password-file file:///opt/apps/sqoop/sqp_db.pwd --table dw_zy_data_log --fields-terminated-by '\t' -m 4 --hive-import --hive-table dw_zy_data_log  --incremental append --check-column log_id --last-value 125444391

执行:
sqoop job --exec sqp_zy_log
log_id变为125612521。

检查:

hive -e "select max(log_id) from dw_zy_data_log;"

OK.
 

参考 https://www.cnblogs.com/Alcesttt/p/11432547.html

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值