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