【问题标题】:Unable to Load Tab-delimited Txt File from S3 into Redshift无法将制表符分隔的 Txt 文件从 S3 加载到 Redshift
【发布时间】:2017-04-15 00:23:13
【问题描述】:

在 SQLWorkbenchJ,我正在尝试使用以下命令将一个以“制表符”分隔的文本文件从 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

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

【问题讨论】:

  • 能否请您分享您的数据文件的几行,也正如@John Rotenstein 所提到的,您可以使用“select * from stl_load_errors order by starttime desc limit 1”查询来检查 stl_load_errors。
  • 嗨@AjGupta,我分享了我的数据文件的几行。我尝试使用 stl_load_errors 并没有返回任何内容。

标签: amazon-s3 amazon-redshift


【解决方案1】:

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

【讨论】:

  • 你好。所以我尝试同时运行 STL_LOAD_ERRORS 和 STL_LOADERROR_DETAIL,但它只返回没有内容的列标题(即 userid、slice、tbl、starttime、...、err_reason)。
【解决方案2】:

您所说的消息不是“错误”。您的表将包含所有记录。它只是说没有添加任何记录。

【讨论】:

    【解决方案3】:

    尝试使用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+$\")"
    ...
    

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

    【讨论】:

    • 您能否提供有关更改的更多详细信息?这对我来说看起来很像?
    • 我编辑了评论。没有注意到编辑删除了一个反斜杠。这个想法是:而不是 \t,键入 \\t。由于字符的转义,这会产生影响,就像我在回答中所做的一样,因为我写了两个反斜杠 t 和一个反斜杠 t,而且两次都只显示一个反斜杠 t。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多