我正试图从使用AWS S3SelectObjectContent
和SQL表达式以CSV格式存储的数据中发出选择请求。我和拉拉威尔6号一起工作。
当我从对象('Expression' => 'SELECT * from S3Object'
(请求所有数据时,一切都很好。我检索数据并可以使用它。当我想在SQL表达式中使用WHERE
-子句时,就会出现问题。
这是我的代码:
$client = new S3Client([
'region' => 'us-east-2',
'version' => 'latest',
]);
$results = $client->selectObjectContent([
'Bucket' => 'mybucketname',
'Key' => 'my_data_file.csv',
'ExpressionType' => 'SQL',
'Expression' => 'SELECT * FROM S3Object s WHERE s.continent = "Europe"',
'InputSerialization' => [
'CSV' => [
'FileHeaderInfo' => 'USE',
'RecordDelimiter' => "n",
'FieldDelimiter' => ',',
],
],
'OutputSerialization' => [
'CSV' => [
'QuoteFields' => 'ASNEEDED',
'RecordDelimiter' => ",",
],
],
]);
我得到以下错误:
Error executing "SelectObjectContent"
<Error><Code>MissingHeaders</Code><Message>Some headers in the query are missing (truncated...) MissingHeaders (client): Some headers in the query are missing from the file. Please check the file and try again.
当我检查文件(直接从S3存储桶下载(时,在第一行中,我发现标题以逗号分隔,正如我所期望的:continent,country,user_name,created_at
我还尝试使用位置标头,并将表达式更改为'Expression' => 'SELECT * FROM S3Object s WHERE s._1 = "Europe"'
和'FileHeaderInfo' => 'IGNORE'
,但这给了我另一个错误:
Error executing "SelectObjectContent"
<Error><Code>InvalidColumnIndex</Code><Message>The column index at line 1, column (truncated...) InvalidColumnIndex (client): The column index at line 1, column 39 is invalid. Please check the service documentation and try again.
我不知道该怎么办。我已经看过这篇文章了,但没有帮助。也许有人有线索?请随时告诉我您可能需要什么进一步的信息来帮助我解决这个问题!
提前感谢!
编辑
我尝试通过AWS控制台查询csv文件,一切都很好:SQL表达式中我使用了文件头信息,也使用了位置头。在我的控制器中传输SQL表达式时,我得到了与上面提到的相同的错误:
查询'SELECT * FROM S3Object WHERE continent = "Europe"'
(和'FileHeaderInfo' => 'USE'
(缺少标头
查询'SELECT * FROM S3Object s WHERE s_1 = "Europe"'
(和'FileHeaderInfo' => 'NONE'
(的列索引无效
我刚刚解决了它。问题是SQL表达式的WHERE
子句中显然只允许使用单引号。
所以在下面你可以找到所有对我有用的表达式:
1.带有'FileHeaderInfo'=>'使用
'Expression' => "SELECT * FROM S3object WHERE continent = 'Europe'"
2.带有'FileHeaderInfo'=>'NONE'(位置标头和S3对象别名(
'Expression' => "SELECT * FROM S3object s WHERE s._1 = 'Europe'"
3.带有'FileHeaderInfo'=>'NONE'(不带S3对象别名的位置标头(
'Expression' => "SELECT * FROM S3object WHERE _1 = 'Europe'"
注意:重要的是用双引号括住实际查询,这样就可以将要使用WHERE子句查询的字符串放在单引号中。
我还从AWS文档中看到了这个网站,它更详细地解释了S3SELECT
命令!
希望这能帮助到一些人!