AnalyticDB PostgreSQL版支持多種數據導入方法,在通過OSS高速并行導入和通過\COPY命令導入數據的過程中,經常因為存在特殊字符導致導入失敗。本文將介紹預先處理導入數據中的特殊字符的方法,從而消除特殊字符帶來的問題。
更多導入數據到AnalyticDB PostgreSQL版的方案,請參見數據遷移及同步方案綜述。
OSS高速并行導入
在數據導入過程中,一般是將文件的每行作為一個元組,通過在每行中規定分隔符來分割每一列的數據。下文將介紹分隔符的使用方法和約束,以及每列中遇到特殊符號的處理方法。
分隔符
在創建OSS外部表語法中,您可以通過在FORMAT子句后面指定DELIMITER分隔符,如下:
FORMAT 'TEXT' (DELIMITER ',')
- 如果
FORMAT 'TEXT'
,則DELIMITER
缺省值為'\t'
。 - 如果
FORMAT 'CSV'
,則DELIMITER
缺省值為','
。
您也可以自定義DELIMITER,但是創建外部表語法中自定義的DELIMITER必須滿足以下約束:
- 必須是一個ASCII字符,不允許是漢字或者2個以及以上ASCII字符。
- 不支持
'\n'
和'\r'
。 - 支持除
'\n'
和'\r'
之外的其他轉義字符,使用時前面加E或者e。 - 支持前面不加E的轉義字符
'\t'
。 - 如果是TEXT模式,可以設置DELIMITER為OFF,支持單列外部表。
為了能夠正常讀取數據,您提供的OSS文件內容必須嚴格遵守設置的DELIMITER。
數據中的特殊符號
在數據導入過程中,出現特殊符號的場景可以分為以下幾種:
- 列中存在和DELIMITER相同的字符。
- 如果您使用TEXT模式,則需要在每個DELIMITER字符前加ESCAPE符。ESCAPE符可以在創建外表時使用以下命令指定,缺省值為反斜杠(\)。
FORMAT 'TEXT' (ESCAPE '\' )
- 如果您使用的是CSV模式,則需要在每個DELIMITER字符前加雙引號(”)。
- 如果您使用TEXT模式,則需要在每個DELIMITER字符前加ESCAPE符。ESCAPE符可以在創建外表時使用以下命令指定,缺省值為反斜杠(\)。
- 列中存在中文。OSS外表支持中文數據,但是為了保證顯示正確,您需要在創建外表時設置如下編碼格式:
ENCODING 'UTF8'
- 列中存在null。您可以設置null對應的匹配字符,在導入數據時將對應的字符匹配為null。CSV模式下缺省值為不帶引號的空值,TEXT模式下缺省值為\N。以下命令將空格作為null的匹配字符,如果該列為空格,則在使用OSS文件導入的數據中該列值為null。
FORMAT 'text' (null ' ' )
- 列中存在轉義字符。您可以在轉義字符前增加ESCAPE符。ESCAPE符在創建外表時指定,CSV模式缺省值為雙引號(”),TEXT模式缺省值為反斜杠(\)。
- 您可以自定義ESCAPE為單個字符。例如,以下命令將ESCAPE設置為反斜杠:
FORMAT 'csv' (ESCAPE '\' )
- 您也可以設置ESCAPE為OFF,避免所有字符被自動轉義。
- 您可以自定義ESCAPE為單個字符。例如,以下命令將ESCAPE設置為反斜杠:
- 列中存在單引號或者雙引號。
- 如果您使用TEXT模式,需要在單引號或者雙引號前面增加ESCAPE符,默認為反斜杠(\)。
- 如果您使用CSV模式,需要在單引號或者雙引號前面增加ESCAPE符,默認為雙引號(”),同時在該列前后加雙引號(”),將整列括起來。
\COPY數據導入
您在使用\COPY命令導入數據時,分隔符的使用方法和OSS高速并行導入時的使用方法一樣,而對數據中出現特殊符號的處理方法也和OSS高速并行導入相類似。不同的是\COPY命令和CREATE EXTERNAL TABLE
語句用法略有不同,\COPY命令詳細用法見使用\COPY命令導入本地數據。