sqoop编写

Sqoop中都以hdfs为主体:hdfs(数据经过处理)通过sqoop指令导出到mysql。

mysql(数据经过沉淀,需要保存)通过sqoop指令导入到hdfs

sqoop-import(导入)

在Sqoop中,import“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据

  • 示例:RDBMS(mysql) —— HDFS
bin/sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--table t_user \
--num-mappers 4 \
--fields-terminated-by '\t' \
--target-dir /mysql/t_user \
--delete-target-dir

# 从MySQL中直接读取一个整表数据
# 如果配置了环境变量,则可以在linux系统中任意一个位置执行下述语句

sqoop import \   # import 指的是要将 关系型数据库中的数据传递到 hadoop 中
--driver com.mysql.jdbc.Driver \  # 要连接的数据库的驱动,需要在安装的时候提前放入lib目录
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \  # 提供jdbc连接串,注意:连接的数据库名一定是存在的
--username root \      # MySQL数据库的登录名
--password 123456 \    # MySQL数据库的登录密码
--table t_user \       # 指的是要读取test1 这个数据库中的哪个表:t_user(表要提前存在)
--num-mappers 4 \      # 设置mr程序中的maptask并行度 (sqoop会根据MySQL表中的主键进行数据的拆分),结果文件会有4个
--fields-terminated-by '\t' \    # 生成文件中的分隔符指定
--target-dir /mysql/t_user \     # 设定目标目录(一定是hdfs中的目录)
--delete-target-dir    # 如果目标目录存在,则删除再导入

# 按照条件,抽取MySQL中的数据进行传递
sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--table t_user \
--columns "id,name" \   # 可以通过columns 参数指定要抽取的字段
--where "id > 2" \      # 可以通过where 参数进行条件筛选,通常在这个地方会写:deal_date = '20220830'
--target-dir /mysql/t_user \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by '\t'


--fields-terminated-by '\t' \
--query 'select t1.id,t1.name,t1.age,t2.sex_name from t_user t1 left join dim_sex t2 on t1.sex = t2.sex_id where $CONDITIONS  and t1.id > 4 LIMIT 3' \  # sqoop支持通过SQL语句进行数据的抽取,SQL语句中必须有where条件且必须在where后面添加$CONDITIONS关键字,如果有更多的条件需要加入到SQL中时,需要在$CONDITIONS关键字后面加上 and 进行条件的连接
--target-dir /mysql/t_user \


--fields-terminated-by ',' \
--query 'select id,name from t_user where $CONDITIONS   ' \
--target-dir /user/hive/warehouse/test_hive.db/test_sqoop \   # 测试直接向 hive表中的location放入数据
--delete-target-dir


# 通过sqoop直接向hive 表中输入数据:
--fields-terminated-by "\t" \
--hive-overwrite \              # 表数据是否需要覆盖
--hive-database test_hive \     # 指明表所在的数据库
--hive-table hive_user          # 指明要将数据输入到哪个表中,如果表不存在则会创建

sqoop-export(导出)

在Sqoop中,export“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS关系型数据库)中传输数据

  • 示例:HDFS|hive —— RDBMS(mysql)
bin/sqoop export \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--table t_user2 \
--update-key id \
--update-mode allowinsert \
--export-dir /sqoop \
--input-fields-terminated-by ' '

# 数据从hdfs中导出到MySQL
sqoop export \   # export 标记该指令为 导出 动作
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--table t_user2 \   # --table 这个参数,只标识 传统数据库中的表名,指定的这个表一定是提前存在的
--update-key id \   # 通过设定 update-key 进行数据的更新操作和判定是否为新数据的操作             
--update-mode allowinsert \   
# allowinsert  在遇到相同的主键时更新数据,如果不相同则允许插入 
# updateonly   只更新数据,不插入新的数据
--export-dir /sqoop \  # “导出目录”:指的是hdfs中的一个路径,sqoop会从中进行数据的抽取
--input-fields-terminated-by ' '  # 被读取的hdfs中的文件的分隔符

Mysql中如果表不存在,不会自动创建

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值