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。文件中的每一行都包含几个以分号分隔的文本字段。
注:
- 当我“hadoop copyToLocal”并在 vi 中打开该文件时,我在文件中的每个输出字符之间看到一个 NULL (^@) 字符。
- file -i 显示“application/octet-stream; charset=binary”
- Linux环境returnsLANG=en_US.UTF-8
- ImpalaSQL 中的 CREATE EXTERNAL TABLE 正确显示 table,但是...
- 一列 DATE_ID 是 YYYY-MM-DD 格式的字符串。当我 SELECT LENGTH(DATE_ID),
我得到 21 的长度,而不是 10 的长度(TRIM() 之前和之后)。
- 指定 tblproperties('serialization,encoding'='UTF-8') 或
tblproperties('serialization,encoding'='UTF-16')
没有区别,我仍然得到 21 的长度。
- 其他列,不仅仅是 DATE_ID,也有同样的问题。
- 替换以“;”结尾的字段以“\u003B”(unicode 分号)结尾的字段没有区别。
关于如何在此状态下读取外部数据,或防止在此状态下通过 PUT_LINE() 将其写出有任何想法吗?
我还没有找到使用 serialization.encoding 选项来解决问题的方法,但有两个解决方法:
使用 PRINT() 或 DBMS_OUTPUT.PUT_LINE() 将文本字符串写入 Linux 文件系统,然后将其推送到 HDFS。
使用REGEXP_REPLACE去除每列中的空字符:
regexp_replace(column-name,'\x00','')
我正在使用 HPL/SQL 的 UTL_FILE 函数 PUT_LINE() 将文本直接写入文件到 HDFS。文件中的每一行都包含几个以分号分隔的文本字段。
注:
- 当我“hadoop copyToLocal”并在 vi 中打开该文件时,我在文件中的每个输出字符之间看到一个 NULL (^@) 字符。
- file -i 显示“application/octet-stream; charset=binary”
- Linux环境returnsLANG=en_US.UTF-8
- ImpalaSQL 中的 CREATE EXTERNAL TABLE 正确显示 table,但是...
- 一列 DATE_ID 是 YYYY-MM-DD 格式的字符串。当我 SELECT LENGTH(DATE_ID), 我得到 21 的长度,而不是 10 的长度(TRIM() 之前和之后)。
- 指定 tblproperties('serialization,encoding'='UTF-8') 或 tblproperties('serialization,encoding'='UTF-16') 没有区别,我仍然得到 21 的长度。
- 其他列,不仅仅是 DATE_ID,也有同样的问题。
- 替换以“;”结尾的字段以“\u003B”(unicode 分号)结尾的字段没有区别。
关于如何在此状态下读取外部数据,或防止在此状态下通过 PUT_LINE() 将其写出有任何想法吗?
我还没有找到使用 serialization.encoding 选项来解决问题的方法,但有两个解决方法:
使用 PRINT() 或 DBMS_OUTPUT.PUT_LINE() 将文本字符串写入 Linux 文件系统,然后将其推送到 HDFS。
使用REGEXP_REPLACE去除每列中的空字符:
regexp_replace(column-name,'\x00','')