利用sqoop将hive和mysql数据互导入(转)

您所在的位置:网站首页 在mysql中如何导入数据库表的数据 利用sqoop将hive和mysql数据互导入(转)

利用sqoop将hive和mysql数据互导入(转)

2024-07-16 01:48| 来源: 网络整理| 查看: 265

文章目录 一、sqoop 将数据从mysql 导入 hive二、sqoop 将数据从hive导出到 mysql

一、sqoop 将数据从mysql 导入 hive

导入步骤为:

a.先将mysql数据用sqoop导入到hdfs中

sqoop import --connect jdbc:mysql://xxx:3306/xxx \ --username xxx \ --password xxx \ --query 'select columns from table_name where $CONDITIONS' \ --target-dir /user/hdfs/imp \ --delete-target-dir \ --num-mappers 1 \ --compress \ --compression-codec org.apache.hadoop.io.compress.SnappyCodec \ --fields-terminated-by '\t'

如果导出的数据库是mysql 则可以添加一个 属性 --direct ,数据导出速度会快一点,我在uat环境中测试了此参数,似乎在数据不大的导出时,对速度的影响不太明显。

–direct 使用直接导出模式(优化速度)

若执行成功后,可在hive验证是否导入成功,命令为

dfs -ls /user/hdfs/imp

b.在hive中创建一张表

drop table if exists default.testDemo; create table default.testDemo( id string, name string, branch_name string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;

c.将hdfs中的数据导入到hive中

load data inpath '/user/hdfs/imp' into table default.testDemo;

验证是否导入hive成功 :

select * from default.testDemo; 二、sqoop 将数据从hive导出到 mysql

使用 staging-table(临时表)参数,保证数据完全成功导出到临时表(testDemo_tmp)表中,再把testDemo_tmp 中的数据move到目标表(testDemo)。这种方式的前提是:临时表和目标表表结构必须完全一致。

sqoop export \ --connect jdbc:mysql://xxxx:3306/db_base \ --username xxx \ --password xxx \ --input-fields-terminated-by "\001" \ --input-lines-terminated-by "\n" \ --input-null-string "\\n" \ --input-null-non-string "\\n" \ --staging-table testDemo_tmp \ --clean-staging-table \ --table testDemo \ --export-dir hdfs_url_xxx/hive_table_xxx \ --columns "column,...,columns"

此种方法导出有个弊端,若mysql表有主键约束,就不能反复执行sqoop导出(会因为主键冲突导出失败)。当时我们的优化方案时,在执行sqoop export之前,调一段shell脚本根据导入条件delete一遍。

#!/bin/bash function clearData(){ dateStr=`date -d 'yesterday' +%Y%m%d` result=`mysql -h$1 -u$2 -p$3


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3