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)(”)。
  • 列中存在中文。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)義。
  • 列中存在單引號(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ù)