内容纲要
概要描述
CLOB字段从Oracle导入到inceptort时,如果CLOB中有换行符,在导入hdfs的时候,数据文件条数会对不上,这里提供demo及解决方案。
详细说明
1. 创建oracle原表,clob列包含换行符
--创建表
DROP TABLE tmp_clob;
CREATE TABLE tmp_clob (name VARCHAR2(200),age NUMBER, c_clob CLOB);
--插入包含换行符的数据
DECLARE
my_clob CLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(my_clob, TRUE);
DBMS_LOB.WRITE(my_clob, 12801, 1, RPAD('111111' || CHR(10), 12801, '1'));
INSERT INTO tmp_clob (name,age,c_clob) VALUES ('zhangsan',18,my_clob);
COMMIT;
END;
SELECT CASE WHEN INSTR(c_clob, CHR(10)) > 0 THEN 'EXITS' ELSE 'NOT EXISTS' END AS newline_check from tmp_clob; --EXISTS
2. 使用TDH-Client客户端集成的sqoop命令将oracle数据导入到hdfs路径下
sqoop import \
--connect jdbc:oracle:thin:@172.22.23.9:1521/helowin \
--username lkw \
--password 123456 \
--table lkw.tmp_clob \
--columns "name,age,c_clob" \
--split-by age -m 4 \
--target-dir /tmp/dst_clob10 \
--fields-terminated-by "\\01" \
--hive-drop-import-delims \
--null-string '\\N' \
--null-non-string '\\N'
从HDFS路径中查看导入的文件,可以看到有2条数据
[root@kv1~]# hdfs dfs -ls /tmp/dst_clob10
2024-04-16 14:56:50,742 INFO util.KerberosUtil: Using principal pattern: HTTP/_HOST
Found 2 items
-rw-r--r-- 3 hdfs hadoop 0 2024-04-16 14:55 /tmp/dst_clob10/_SUCCESS
-rw-r--r-- 3 hdfs hadoop 12814 2024-04-16 14:55 /tmp/dst_clob10/part-m-00000
[root@kv1~]# hdfs dfs -cat /tmp/dst_clob10/part-m-00000 | wc -l
2024-04-16 15:15:54,513 INFO util.KerberosUtil: Using principal pattern: HTTP/_HOST
2
这里如果通过创建inceptor外表的方式能看到数据换行
DROP TABLE IF EXISTS test_clob01;
CREATE EXTERNAL TABLE test_clob01
(NAME STRING ,AGE INT,C_CLOB BINARY)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001'
LOCATION '/tmp/dst_clob10/';
解决方案
sqoop import \
--connect jdbc:oracle:thin:@172.22.23.9:1521/helowin \
--username lkw \
--password 123456 \
--table lkw.tmp_clob \
# 添加如下这行
--map-column-java c_clob=String \
--columns "name,age,c_clob" \
--split-by age -m 4 \
--target-dir /tmp/dst_clob12 \
--fields-terminated-by "\\01" \
# !!!注意:这里必须要把--hive-drop-import-delims
写上去
--hive-drop-import-delims \
--null-string '\\N' \
--null-non-string '\\N'
[root@kv1~]# hdfs dfs -ls /tmp/dst_clob12/
2024-04-16 15:15:45,446 INFO util.KerberosUtil: Using principal pattern: HTTP/_HOST
Found 2 items
-rw-r--r-- 3 hdfs hadoop 0 2024-04-16 15:15 /tmp/dst_clob12/_SUCCESS
-rw-r--r-- 3 hdfs hadoop 12813 2024-04-16 15:15 /tmp/dst_clob12/part-m-00000
[root@kv1~]# hdfs dfs -cat /tmp/dst_clob12/part-m-00000 | wc -l
2024-04-16 15:15:54,513 INFO util.KerberosUtil: Using principal pattern: HTTP/_HOST
1
Sqoop import参数选项 --hive-drop-import-delims
对CLOB中换行符是没有效果的,需要显示添加--map-column-java CLOB列名=String
,这样--hive-drop-import-delims
才能去除CLOB中的换行符。