SQOOP 导入:删除 ORACLE CLOB 数据类型中的 pilcrow
SQOOP Import : remove pilcrow in ORACLE CLOB data type
我正在使用 sqoop 将 ORACLE 表导入 Hive (Hadoop)。
但是 ORACLE 表中的某些字段是带有“pilcrow”(¶) 的 CLOB 类型。
我想删除这些“pilcrows”(段落符号)。
有没有人有直接在 sqoop 命令或 sql?
中执行此操作的方法
感谢您的帮助。
正如我在评论中告诉您的那样,让我向您展示一种实现此目的的方法,即使用 Oracle 中的函数替换 CLOB 字段中的任何字符
在下面的演示中,我使用 Oracle 12cR2 和 AL32UTF8 作为字符集。
SQL> create table dptos ( c1 number , c2 number , c3 clob );
Table created.
SQL> insert into dptos values ( 1 , 1, 'Clob Example with Ascii extended character € here' );
1 row created.
SQL> commit ;
Commit complete.
SQL> select * from dptos ;
C1 C2
---------- ----------
C3
--------------------------------------------------------------------------------
1 1
Clob Example with Ascii extended character € here
我的函数用另一个字符串或什么都不替换模式(可以是字符或 ascii 函数)
CREATE OR REPLACE FUNCTION CLOBREPLACE (p_input CLOB
, p_pattern VARCHAR2
, p_substitute CLOB)
RETURN CLOB
IS
C_MAXLEN CONSTANT NUMBER := 32000;
v_fclob CLOB := p_input;
v_foffset INTEGER;
v_fchunk CLOB;
BEGIN
IF LENGTH (p_substitute) > C_MAXLEN
THEN
v_foffset := 1;
v_fclob := REPLACE (v_fclob, p_pattern, '###CLOBREPLACE###');
<<replace_by_loop>>
WHILE v_foffset <= LENGTH (p_substitute)
LOOP
v_fchunk :=
SUBSTR (p_substitute, v_foffset, C_MAXLEN)
|| '###CLOBREPLACE###';
v_fclob := REGEXP_REPLACE (v_fclob, '###CLOBREPLACE###', v_fchunk);
v_foffset := v_foffset + C_MAXLEN;
END LOOP replace_by_loop;
v_fclob := REGEXP_REPLACE (v_fclob, '###CLOBREPLACE###', '');
ELSE
v_fclob := REPLACE (v_fclob, p_pattern, p_substitute);
END IF;
RETURN v_fclob;
END clobreplace;
/
让我们检查一下
SQL> select c1 , c2, clobreplace ( c3 , '€' , 'Euros' ) from dptos ;
C1 C2
---------- ----------
CLOBREPLACE(C3,'€','EUROS')
--------------------------------------------------------------------------------
1 1
Clob Example with Ascii extended character Euros here
如果您在从 sqoop 调用该函数时遇到问题,您始终可以使用 select 创建一个视图,然后 运行 sqoop 覆盖该视图。
我正在使用 sqoop 将 ORACLE 表导入 Hive (Hadoop)。 但是 ORACLE 表中的某些字段是带有“pilcrow”(¶) 的 CLOB 类型。 我想删除这些“pilcrows”(段落符号)。 有没有人有直接在 sqoop 命令或 sql?
中执行此操作的方法感谢您的帮助。
正如我在评论中告诉您的那样,让我向您展示一种实现此目的的方法,即使用 Oracle 中的函数替换 CLOB 字段中的任何字符
在下面的演示中,我使用 Oracle 12cR2 和 AL32UTF8 作为字符集。
SQL> create table dptos ( c1 number , c2 number , c3 clob );
Table created.
SQL> insert into dptos values ( 1 , 1, 'Clob Example with Ascii extended character € here' );
1 row created.
SQL> commit ;
Commit complete.
SQL> select * from dptos ;
C1 C2
---------- ----------
C3
--------------------------------------------------------------------------------
1 1
Clob Example with Ascii extended character € here
我的函数用另一个字符串或什么都不替换模式(可以是字符或 ascii 函数)
CREATE OR REPLACE FUNCTION CLOBREPLACE (p_input CLOB
, p_pattern VARCHAR2
, p_substitute CLOB)
RETURN CLOB
IS
C_MAXLEN CONSTANT NUMBER := 32000;
v_fclob CLOB := p_input;
v_foffset INTEGER;
v_fchunk CLOB;
BEGIN
IF LENGTH (p_substitute) > C_MAXLEN
THEN
v_foffset := 1;
v_fclob := REPLACE (v_fclob, p_pattern, '###CLOBREPLACE###');
<<replace_by_loop>>
WHILE v_foffset <= LENGTH (p_substitute)
LOOP
v_fchunk :=
SUBSTR (p_substitute, v_foffset, C_MAXLEN)
|| '###CLOBREPLACE###';
v_fclob := REGEXP_REPLACE (v_fclob, '###CLOBREPLACE###', v_fchunk);
v_foffset := v_foffset + C_MAXLEN;
END LOOP replace_by_loop;
v_fclob := REGEXP_REPLACE (v_fclob, '###CLOBREPLACE###', '');
ELSE
v_fclob := REPLACE (v_fclob, p_pattern, p_substitute);
END IF;
RETURN v_fclob;
END clobreplace;
/
让我们检查一下
SQL> select c1 , c2, clobreplace ( c3 , '€' , 'Euros' ) from dptos ;
C1 C2
---------- ----------
CLOBREPLACE(C3,'€','EUROS')
--------------------------------------------------------------------------------
1 1
Clob Example with Ascii extended character Euros here
如果您在从 sqoop 调用该函数时遇到问题,您始终可以使用 select 创建一个视图,然后 运行 sqoop 覆盖该视图。