sqoop处理clob包含换行符的情况

  其他常见问题
内容纲要

概要描述


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中的换行符。

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。