HPL/SQL UTL_FILE.PUT_LINE 在每个字符之间放置 NULL 字符

HPL/SQL UTL_FILE.PUT_LINE Puts NULL Character Between Each Character

我正在使用 HPL/SQL 的 UTL_FILE 函数 PUT_LINE() 将文本直接写入文件到 HDFS。文件中的每一行都包含几个以分号分隔的文本字段。

注:

  1. 当我“hadoop copyToLocal”并在 vi 中打开该文件时,我在文件中的每个输出字符之间看到一个 NULL (^@) 字符。
  2. file -i 显示“application/octet-stream; charset=binary”
  3. Linux环境returnsLANG=en_US.UTF-8
  4. ImpalaSQL 中的 CREATE EXTERNAL TABLE 正确显示 table,但是...
  5. 一列 DATE_ID 是 YYYY-MM-DD 格式的字符串。当我 SELECT LENGTH(DATE_ID), 我得到 21 的长度,而不是 10 的长度(TRIM() 之前和之后)。
  6. 指定 tblproperties('serialization,encoding'='UTF-8') 或 tblproperties('serialization,encoding'='UTF-16') 没有区别,我仍然得到 21 的长度。
  7. 其他列,不仅仅是 DATE_ID,也有同样的问题。
  8. 替换以“;”结尾的字段以“\u003B”(unicode 分号)结尾的字段没有区别。

关于如何在此状态下读取外部数据,或防止在此状态下通过 PUT_LINE() 将其写出有任何想法吗?

我还没有找到使用 serialization.encoding 选项来解决问题的方法,但有两个解决方法:

  1. 使用 PRINT() 或 DBMS_OUTPUT.PUT_LINE() 将文本字符串写入 Linux 文件系统,然后将其推送到 HDFS。

  2. 使用REGEXP_REPLACE去除每列中的空字符:

    regexp_replace(column-name,'\x00','')