sqoop抽取数据问题:倒入ODS
原系统表结构修改问题:抽取数据指定字段
无影响:无需修改hive表结构
(1).原系统表结构字段顺序调整无影响
(2).原系统增加字段但HDFS不需要,无影响
(3).原系统删减字段,sqoop相应字段放空,无影响
有影响:
原系统增加字段:需修改hive表结构
1).不刷历史数据:备份表数据,drop目标表然后create,insert回去
2).刷历史数据:备份表数据1,sqoop全量抽数到临时表2,drop目标表然后create,备份数据表与临时表join,insert回去
-------------------------------
抽数问题:
1.全量:
1).不保存历史版本
直接INSERT OVERWRITE
2).保存历史版本
表结构为分区表
2.增量:无分区,也不能有分区:数据要保持与原系统一致
注:现代的数据库中只会修改数据(包括逻辑删除),无物理删除
sqoop抽数到hive的临时表STG
select全量数据插入到HIS
HIS LEFT JOIN STG (根据唯一标识:保证多对一/一对一关联) WHERE中STG根据唯一标识放空
至此筛选出不需要更新的数据
UNION ALL STG数据
注:sqoop抽数只支持文本格式,HDFS为减少成本存储为压缩格式
)
COMMENT '应收月报'
PARTITIONED BY (PART_SC STRING, PART_DT STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\036'
STORED AS PARQUET
;
---------------------------------------
常见问题:
1.sqoop的默认分隔符为:/001,而不是/t
2.字符串为空的问题:String类型为空,非String类型为空
3.字段分隔符 \t,行分隔符/n
4.hive(hdfs目录)导入mysql主要mysql不能有主键,数据类型对应的问题,典型例子:mysql中的tinyint通过sqoop导入hive中自动转换为boolean。
例子:
sqoop export --connect jdbc:mysql://10.143.90.40:3306/Biz_bigdata
--username root --password bigdata --table ODS_CHA_SPREAD_REWARD_RECORD --input-fields-terminated-by '\t' --lines-terminated-by '\n' --export-dir '/apps/hive/warehouse/biz_bigdata.db/ods_cha_spread_reward_record' --input-null-string '\\N' --input-null-non-string '\\N'
5.通过sqoop,hive往mysql到数据时:当字符串过长时,hive中的string类型数据,在mysql中需要用设定为text类型。
6.通过sqoop 从hive往mysql导入数据,当字段为mysql特殊字段,需要改字段名称。
7.倒表一定要注意字段顺序。
8.隐式转换问题:hive往mysql倒数据:tinyint类型时,hive表自动创建则为boolean类型,hive表字段类型为tinyint则数据为NULL,hive表字段为string,数据则为true,false。