SQOOP 导入:删除 ORACLE CLOB 数据类型中的 pilcrow

Posted

技术标签:

【中文标题】SQOOP 导入:删除 ORACLE CLOB 数据类型中的 pilcrow【英文标题】:SQOOP Import : remove pilcrow in ORACLE CLOB data type 【发布时间】:2021-08-15 18:05:01 【问题描述】:

我正在使用 sqoop 将 ORACLE 表导入 Hive (Hadoop)。 但是 ORACLE 表中的某些字段是带有“pilcrow”(¶) 的 CLOB 类型。 我想删除这些“枕头”(段落符号)。 有没有人有办法直接在sqoop命令或者sql里面做这个?

感谢您的帮助。

【问题讨论】:

我过去遇到过类似的问题,使用不同的 ASCII 扩展字符。对我来说最好的方法是创建一个函数来替换 clob 字符串中的这些字符并在您在 sqoop 中使用的 select 语句中调用该函数,或者使用该函数创建一个带有 select 的视图,然后在视图上运行 sqoop。如果你有兴趣,我可以提供一个clob函数的例子 @RobertoHernandez,如果你能做到(提供该功能或示例),我将不胜感激。谢谢。 我发布我的答案。如果您支持它,我将不胜感激。谢谢 【参考方案1】:

正如我在 cmets 中告诉您的,让我向您展示一种实现此目的的方法,即使用 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 CLOB 数据类型中的 pilcrow的主要内容,如果未能解决你的问题,请参考以下文章

Sqoop处理Clob与Blob字段

Sqoop:导入所有转换 blob 类型的表

hive-drop-import-delims选项对oracle的clob无效

DB2中如何将一个clob类型的字段改为varchar类型

sqoop 从oracle抽数据是 sql怎么写

我用sqoop从oracle导入数据到hdfs时,总是报 表或视图不存在错误,求解答...