私COPY
コマンドは次のエラーを受信し続ける:Redshift Copyコマンドで 'no-break space'文字をNULLにする方法は?
Missing newline: Unexpected character 0x73 found at location 4194303
私は非ASCII文字を確認するには、次の関数を使用して、それを実行しました:
def return_non_ascii_codes(input: str):
for char in input:
if ord(char) > 127:
yield ord(char)
そして、私は数を持っていたことが判明します160
コードを返した文字のUnicode
チャートにこれを見ると、これはnon-break space
文字であるように見えます:http://www.fileformat.info/info/unicode/char/00a0/index.htm
私はNULL
にこれらの文字の私COPY
コマンドで実行したいが、私は使用すべきか、正しい文字列/形式が不明です。次のように
COPY
コマンドは次のとおりです。
COPY xxx
FROM 's3://xxx/cleansed.csv'
WITH CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx'
-- GZIP
ESCAPE
FILLRECORD
TRIMBLANKS
TRUNCATECOLUMNS
DELIMITER '|'
BLANKSASNULL
REMOVEQUOTES
ACCEPTINVCHARS
TIMEFORMAT 'auto'
DATEFORMAT 'auto';
EDIT: 私は文字を見つけるためにはPythonを使用しますが、Pythonは私のパイプラインで実際の処理のいずれかを実行しません。私たちのPostgreSQL
データベースからCOPY TO STDOUT
コマンドを実行してから、へのコピーのためにそれらのファイルを直接S3
にアップロードします。したがって、これらの2つの場所のいずれかで処理する必要があります。私はそうのように、すべての非ASCII文字を浄化する機能を通じてスクリプトを実行した :1
id BIGINT,
quiz_data VARCHAR(65535)
UPDATE:
with open(file, 'r') as inf, open(outfile, 'w') as outf:
for line in inf:
print(return_non_ascii_codes(line))
outf.write(''.join(return_ascii_chars(line)))
def return_ascii_chars(input: str):
return (char for char in input if ord(char) < 127)
ここで
は、2つの宛先テーブルのフィールドですRedshiftにCOPY
を試みました。 ( ""、unichr(160))
私はクレンジングファイルは非ASCII文字を持っていないことをダブルチェックしました
Missing newline: Unexpected character 0x20 found at location 4194303
...
これは決してPythonを実行することはありません。 PostgreSQLの 'COPY TO STDOUT'コマンドからS3ファイルにまっすぐ進み、Redshiftにロードされます。だから私はRedshiftまたはPostgreSQL側でそれを処理する必要があります。 – flybonzai
次に、このタグ付きのpythonはなぜですか? – Artagel
OPに 'python'があるだけです。 – flybonzai