sqoop oracle2hive 通过表名表抽取 和 通过sql抽取 列切分异常
需求:之前数据从生产系统抽取到hive数据仓库都是全表抽取,然后在仓库接口层 或者在ods前置机上处理。
因为项目需要 ,部分全量表是直接按表名抽取 ,部分增量 通过sql 添加where 条件来筛选数据。
环境:sqoop 版本Sqoop 1.4.6-cdh5.12.1 hadoop使用cdh版本
现象:sqoop 使用SQL抽取
sqoop import --connect jdbc:oracle:thin:@IP:1521:sid --username 用户名 --password 密码
--hive-overwrite --hive-database atg --hive-table dwi_dcspp_shipitem_rel_m
--hive-import --delete-target-dir --null-string '' --null-non-string '' --fields-terminated-by \001 --hive-drop-import-delims --target-dir /user/hive/warehouse/atg.db/dwi_dcspp_shipitem_rel_m/m=2017-05
--query "from UATCORE.DCSPP_SHIPITEM_REL SIR
where \\\$CONDITIONS and SIR.COMMERCE_ITEM_ID in
(select OI.COMMERCE_ITEMS
from UATCORE.DCSPP_ORDER_ITEM OI
where \\\$CONDITIONS and OI.Order_Id in
(select DCSO.Order_Id
from UATCORE.DCSPP_ORDER DCSO
where \\\$CONDITIONS and TO_CHAR(DCSO.LAST_MODIFIED_DATE, 'YYYY-MM') = "$thisMonth" ))"
数据是导入过来了 ,但是切分异常 ,都在第一列里。
查看 hive 仓库导入的文件 ,写到本地 用vim 查看,发现分隔符有乱码,因为是指定的分隔符,以前也没有出现问题。所以不确定 是oracle所在的系统问题 还是sqoop转化的java文件有问题。或者是hive所在的linux系统有问题。
时间紧急,我用参数排除法 最终发现删除--fields-terminated-by \001 用默认的就正常了。
时间紧没有去探查sqoop生成的java文件 应该问题在这里可以找到答案。
--hive-import 是使用默认分割符 可能是,也可能是\001 最好指定分隔符。不用此参数。不用理会hive日志警告。