在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
有没有人能解决这个问题?
答案 0 :(得分:1)
检查表STL_LOAD_ERRORS和STL_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个反斜杠。希望对您有所帮助。