无法将制表符分隔的 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的主要内容,如果未能解决你的问题,请参考以下文章