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

Posted

技术标签:

【中文标题】无法将制表符分隔的 Txt 文件从 S3 加载到 Redshift【英文标题】:Unable to Load Tab-delimited Txt File from S3 into 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.

我检查了各种 *** 源和 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 并没有返回任何内容。 【参考方案1】:

检查表STL_LOAD_ERRORS 和STL_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。

以上是关于无法将制表符分隔的 Txt 文件从 S3 加载到 Redshift的主要内容,如果未能解决你的问题,请参考以下文章

加载一个非常大的 txt 文件并进行转置

将大制表符分隔文件读入R [重复]

无法将制表符分隔的文件读入 numpy 二维数组

将 txt 文件复制到 Redshift

在 Spark R 中读取制表符分隔的文本文件

使用 vbs 将 .xlsx 保存为制表符分隔的 .txt 文件