我正在使用 HPL/SQL 的 UTL_FILE 函式 PUT_LINE() 將文本直接寫入 HDFS 檔案。檔案中的每一行都由幾個用分號分隔的文本欄位組成。
筆記:
- 當我“hadoop copyToLocal”并在 vi 中打開該檔案時,我在檔案中的每個輸出字符之間看到一個 NULL (^@) 字符。
- 檔案 -i 顯示“應用程式/八位位元組流;字符集=二進制”
- Linux 環境回傳 LANG=en_US.UTF-8
- ImpalaSQL 中的 CREATE EXTERNAL TABLE 可以正確顯示表,但是...
- 一列 DATE_ID 是 YYYY-MM-DD 格式的字串。當我選擇 LENGTH(DATE_ID) 時,我回傳 21 的長度,而不是 10 的長度(在 TRIM() 之前和之后)。
- 指定 tblproperties('serialization,encoding'='UTF-8') 或 tblproperties('serialization,encoding'='UTF-16') 沒有區別,我仍然回傳 21 的長度。
- 其他列,不僅僅是 DATE_ID,也有同樣的問題。
- 替換以 ';' 結尾的欄位 以 '\u003B' (unicode 分號)結尾的欄位沒有區別。
關于如何在此狀態下讀取外部資料或防止在此狀態下通過 PUT_LINE() 將其寫出的任何想法?
uj5u.com熱心網友回復:
我還沒有找到使用 serialization.encoding 選項解決問題的方法,但有兩種解決方法:
使用 PRINT() 或 DBMS_OUTPUT.PUT_LINE() 將文本字串寫入 Linux 檔案系統,然后將其推送到 HDFS。
使用 REGEXP_REPLACE 洗掉每列中的空字符:
regexp_replace(列名,'\x00','')
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/451371.html
