无法将制表符分隔的Txt文件从S3加载到Redshift中

时间:2017-04-15 00:23:13

标签: amazon-s3 amazon-redshift

在SQLWorkbenchJ上,我正在尝试加载一个文本文件,即' tab'使用以下命令从Amazon S3分隔到Redshift:

COPY table_property
FROM 's3://...txt’
CREDENTIALS 'aws_access_key_id=…;aws_secret_access_key=…’
IGNOREHEADER 1
DELIMITER '\t';

但它会返回以下警告:

Warnings:
Load into table 'table_property' completed, 0 record(s) loaded successfully.

我已经检查了各种Stackoverflow源和Tutorial: Loading Data from Amazon S3,但这些解决方案都不起作用。

我的文本文件中的数据如下所示:

BLDGSQFT    DESCRIPTION LANDVAL STRUCVAL    LOTAREA OWNER_PERCENTAGE
12440   Apartment 15 Units or more      2013005 1342004 1716    100
20247   Apartment 15 Units or more      8649930 5766620 7796.25 100
101             
1635    Live/Work Condominium                   977685  651790  0   100

有没有人能解决这个问题?

3 个答案:

答案 0 :(得分:1)

检查表STL_LOAD_ERRORSSTL_LOADERROR_DETAIL以获取准确的错误消息。

答案 1 :(得分:0)

您正在谈论的消息不是“错误”。你的表将包含所有记录。它只是说没有添加添加记录。

答案 2 :(得分:0)

尝试放置DELIMITER '\\t'而不是DELIMITER '\t'。在我使用Java,PHP和Python的Redshift的许多情况下,这都是可行的。有时甚至会有更多的“ \”符号。它与IDE /语言如何解释应该执行的字符串查询有关。

例如,这是我来自Airflow DAG的代码,我正在处理的事情(如果您不熟悉Airflow,没关系,它基本上是Python代码。

redshift_load_task = PostgresOperator(task_id='s3_to_redshift',
    sql=" \
    COPY " + table_name + "  \
    FROM '{{ params.source }}'  \
    ACCESS_KEY_ID '{{ params.access_key}}'  \
    SECRET_ACCESS_KEY '{{ params.secret_key }}'  \
    REGION 'us-west-2'  \
    ACCEPTINVCHARS  \
    IGNOREHEADER 1  \
    FILLRECORD  \
    DELIMITER '\\t' \
    BLANKSASNULL  \
    EMPTYASNULL  \
    MAXERROR 100  \
    DATEFORMAT 'YYYY-MM-DD' \
    ",
    postgres_conn_id="de_redshift",
    database="my_database",
    params={
        'source': 's3://' + s3_bucket_name + '/' + s3_bucket_key + '/' + filename,
        'access_key': s3.get_credentials().access_key,
        'secret_key': s3.get_credentials().secret_key,
    },
)

注意如何定义定界符DELIMITER '\\t'而不是DELIMITER '\t'。 另一个示例是Hive查询的一部分,通过Spark上的Java代码执行:

...
AND (ip_address RLIKE \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\")"
...

请注意,为了在正则表达式中转义d,而不仅仅是写\d,这里有4个反斜杠。希望对您有所帮助。