Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 使用for循环从s3进行红移复制_Amazon Web Services_Amazon S3_Amazon Redshift_Plpgsql - Fatal编程技术网

Amazon web services 使用for循环从s3进行红移复制

Amazon web services 使用for循环从s3进行红移复制,amazon-web-services,amazon-s3,amazon-redshift,plpgsql,Amazon Web Services,Amazon S3,Amazon Redshift,Plpgsql,我有很多文件要在S3中加载。 我已经在文件的每个前缀处创建了清单文件 例如,在s3://my bucket/unit_1 我有如下文件 chunk1.csv.gz chunk2.csv.gz chunk3.csv.gz cunkk4.csv.gz unit.manifest 因此,使用copy命令,我可以将unit_1文件加载到红移 然而,我有1000多个单位,所以我想做它的循环。 所以我想做一个循环,从1迭代到1000,只改变清单文件的前缀 所以我喜欢下面的内容 创建或替换过程复制\u循环

我有很多文件要在S3中加载。 我已经在文件的每个前缀处创建了清单文件

例如,在s3://my bucket/unit_1 我有如下文件

chunk1.csv.gz
chunk2.csv.gz
chunk3.csv.gz
cunkk4.csv.gz 
unit.manifest
因此,使用copy命令,我可以将
unit_1
文件加载到红移

然而,我有1000多个单位,所以我想做它的循环。 所以我想做一个循环,从1迭代到1000,只改变清单文件的前缀

所以我喜欢下面的内容

创建或替换过程复制\u循环()
语言plpgsql
作为$$
开始
对于1..1000循环中的i
复制我的表格
从's3://my bucket/unit.%/unit.manifest',我
凭证“aws\u iam\u role=arn:aws:iam::myrolearn”
显示
区域“ap-东北-2”
删除引号
信号头1
逃跑
日期格式“自动”
时间格式“自动”
GZIP
分隔符“|”
“接受”字符“?”
计算错误
数字更新错误
最大错误0
空白空白
空空
NULL为'\N'
显式标识;
端环;
结束;
$$;
但我得到了这个信息

SQL错误[500310][42601]:Amazon无效操作:语法错误位于或接近“,”

我如何处理这个问题?

这是我的解决方案

创建或替换过程复制\u循环(i1 int,i2 int)
语言plpgsql
作为$$
声明
前缀文本:='s3://mybucket/unit";
清单文本:='/unit.manifest';
显示位置文本;
复制命令VARCHAR(2000);
copy_options VARCHAR(2000):=“凭证”| quote_literal('aws_iam_role=myrollearn'))
||“舱单”
||“地区”| |引述文字('ap-northeast-2')
||“REMOVEQUOTES”
||“忽略标题1”
||“逃跑”
||“DATEFORMAT”| | quote_literal('auto')
||“TIMEFORMAT”| | quote_literal('auto')
||“GZIP”
||“分隔符”| |引用文字(“|”)
||“ACCEPTINVCHARS”| |引用文字(“?”)
||“计算更新错误”
||“状态更新错误”
||“MAXERROR 0”
||“BLANKSASNULL”
||“空值为空”
||“NULL为”| | quote_literal(“\N”)
||“显式_-id”;
开始
对于i1..i2循环中的i
舱单位置:=前缀| | i | |舱单;
copy|u命令:='copy mytable FROM'| | quote| literal(manifest|u位置)| | copy|u选项;
执行copy_命令;
端环;
结束;
$$;
使用此过程,我可以从1000多个单元复制文件。
另外,设置循环的起始编号和结束编号有助于划分加载作业。由于大量加载需要几个小时,我认为最好使用一些块来完成加载工作。

如果解决方案对您有所帮助,请将其升级,以便将来可以帮助其他人:)