Sqoop三种同步策略

  • 全量覆盖(全量表:一般用于维度表)
    • 不需要分区,先删后写,直接覆盖
sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
--connect 'jdbc:mysql://hadoop01:3306/数据库名?useUnicode=true&characterEncoding=UTF8&autoReconnect=true' \
--username 用户名 \
--password-file file:///export/data/sqoop.passwd \
--query "select * from 表名 where 1=1 and\$CONDITIONS" \
--hcatalog-database yp_ods \
--hcatalog-table t_district \
-m 1

注意:特殊语法使用-D:用于指定修改Sqoop程序的属性org.apache.sqoop.splitter.allow_text_splitter=true:如果--split-by指定的是文本类型,需要开启该参数 where 1= 1用于在程序开发时,方便加条件拼接SQL条件使用,这里可以不加,也可以暂时不管由于Hive中这张表时orc类型,所以必须使用hcatalog方式同步由于使用hcatalog,只能追加,所以每次必须先清空表以后,再进行同步清空表,后面执行脚本采集 清空表, truncate table 表名; 后面执行脚本采集


  • 仅同步新增(增量表)
    • 增量的同步数据
    • 永远只有新增,不会发生更新
    • 场景:登录记录表,访问日志表等
DROP TABLE if exists yp_ods.t_user_login;
CREATE TABLE yp_ods.t_user_login(
id string,
login_user string,
login_type string COMMENT '登录类型(登陆时使用)',
client_id string COMMENT '推送标示id(登录、第三方登录、注册、支付回调、给用户推送消息时使用)',
login_time string,
login_ip string,
logout_time string
)COMMENT '用户登录记录表'
partitioned by (dt string)
row format delimited 
fields terminated by '\t'stored as 
orctblproperties ('orc.compress' = 'ZLIB');

# Sqoop固定同步命令
sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
--connect 'jdbc:mysql://hadoop01:3306/数据库?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true' \
--username root \
--password-file file:///export/data/sqoop.passwd \
--query "select *, '${yesterday}' as dt fromt_user_login where 1=1 and (login_time between'${yesterday} 00:00:00' and '${yesterday}23:59:59') and \$CONDITIONS" \
# substr(login_time,0,10)='2021-12-19' 这个也是去昨天日期的
--hcatalog-database yp_ods \
--hcatalog-table t_user_login \
-m 1

  • 新增及更新同步
    • 每天新增一个日期分区,同步并存储当天的新增和更新数据
    • 例子:用户表,订单表,商品表
sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
--connect 'jdbc:mysql://hadoop01:3306/yipin?useUnicode=true&characterEncoding=UTF8&autoReconnect=true' \
--username root \
--password-file file:///export/data/sqoop.passwd \
--query 'select * from table where 1=1 substr(create_time,0,10) = 昨天的日期 or substr(update_time,0,10) = 昨天的日期' and $CONDITIONS" \
--target-dir /database/table/daystr = 昨天的日期
--hcatalog-database yp_ods \ 
--hcatalog-table t_store \
-m 1

取昨天日期:yesterday=`date -d '-1day' +%Y-%m-%d`

sh -x 脚本路径 可以看脚本执行的详细日志

如果要导入很多张表:

#!/bin/bash
# 定义日期
if [ $# -ne 0 ]
then
    pdt=$1
else
    pdt=`date -d '-1 day' +%Y%m%d`
fi

# 表比较多: 不同的采集方式的表名放入不同的文件中

# 全量采集表名: ods_full_tbnames.txt
while read full_tbname
do
    /usr/bin/sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
    --connect 'jdbc:mysql://xxx.xxx.xx.xxx:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true' \
    --username root \
    --password-file file:///export/data/sqoop.passwd \
    --query 'select * from ${full_tbname} where 1=1 and $CONDITIONS" \
    --hcatalog-database 数据库名 \ 
    --hcatalog-table ${full_tbname} \
    -m 1
done < ods_full_tbname.txt

# 增量采集表:ods_incr_new_tbnames.txt

while read tbname
do
    /usr/bin/sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
    --connect 'jdbc:mysql://xxx.xxx.xx.xxx:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true' \
    --username root \
    --password-file file:///export/data/sqoop.passwd \
    --query 'select * from ${tbname} where 1=1 and substr(create_time,0,10)='${pdt}' and $CONDITIONS" \
    --hcatalog-database 数据库名 \ 
    --hcatalog-table ${tbname} \
    -m 1
done < ods_incr_new_tbnames.txt

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Sqoop是一个用于在Hadoop生态系统中传输数据的工具,可以将数据从关系型数据库导入到Hadoop中,也可以将数据从Hadoop导出到关系型数据库中。但是,Sqoop并不支持直接将Hive中的复杂数据类型(如ARRAY、MAP、STRUCT等)导出到MySQL中。为了实现这个功能,需要进行一些额外的处理。 一种解决方案是使用Hive的内置函数将复杂数据类型转换为字符串,然后将其导出到MySQL中。具体步骤如下: 1. 在Hive中创建一个临时表,将需要导出的数据从源表中选择出来。 ``` CREATE TABLE temp_table AS SELECT col1, col2, CAST(col3 AS STRING) AS col3_str FROM source_table; ``` 2. 使用Sqoop将临时表中的数据导出到MySQL中。 ``` sqoop export --connect jdbc:mysql://mysql_host:3306/mysql_db --username mysql_user --password mysql_password --table mysql_table --export-dir /user/hive/warehouse/temp_table --input-fields-terminated-by '\001'; ``` 其中,`--input-fields-terminated-by`参数指定输入数据的分隔符,这里使用了Hive默认的分隔符'\001'。 3. 在MySQL中创建目标表,并将导出的数据加载到目标表中。 ``` CREATE TABLE target_table (col1 INT, col2 STRING, col3_str STRING); LOAD DATA LOCAL INFILE '/path/to/exported/file' INTO TABLE target_table FIELDS TERMINATED BY '\001'; ``` 4. 将MySQL中的col3_str列转换回Hive中的复杂数据类型。 ``` ALTER TABLE target_table ADD col3 ARRAY<STRING>; UPDATE target_table SET col3 = split(col3_str, ','); ALTER TABLE target_table DROP col3_str; ``` 这样,就可以将Hive中的复杂数据类型导出到MySQL中了。需要注意的是,这种方法只适用于较小的数据集,对于大规模数据集,可能需要使用其他方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ButterFly0612

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值