AWS S3 Select 缺少 Headers/无效列索引错误
Missing Headers / Invalid Column Index errors with AWS S3 Select
我正在尝试从使用 AWS S3 SelectObjectContent
和 SQL 表达式以 CSV 格式存储的数据发出 select 请求。我正在与 Laravel 6.
合作
当我从 object ('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 存储桶下载)时,在第一行中我找到了 headers comma-separated,如我所料:continent,country,user_name,created_at
我也尝试使用位置 headers 并将表达式更改为 '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.
我不知道如何进行。我已经看到这个 post,但它没有帮助。也许有人有线索?请随时告诉我您可能需要哪些更多信息来帮助我解决此问题!
提前致谢!
编辑
我尝试通过 AWS 控制台查询 csv 文件,一切正常:我在其中使用文件 header 信息的 SQL 表达式以及我使用位置 headers 代替。在我的控制器中传输 SQL 表达式我得到了我上面提到的相同错误:
查询 'SELECT * FROM S3Object WHERE continent = "Europe"'
(和 'FileHeaderInfo' => 'USE'
)
缺少 Headers
无效列索引 查询 'SELECT * FROM S3Object s WHERE s_1 = "Europe"'
(和 'FileHeaderInfo' => 'NONE'
)
我刚刚解决了。
问题是 SQL 表达式的 WHERE
子句中显然只允许使用单引号。
下面是对我有用的所有表达方式:
1.用 'FileHeaderInfo' => 'USE'
'Expression' => "SELECT * FROM S3object WHERE continent = 'Europe'"
2。 With 'FileHeaderInfo' => 'NONE' (positional headers & S3 object 别名)
'Expression' => "SELECT * FROM S3object s WHERE s._1 = 'Europe'"
3。 With 'FileHeaderInfo' => 'NONE' (positional header without S3 object alias)
'Expression' => "SELECT * FROM S3object WHERE _1 = 'Europe'"
注意: 重要的是将实际查询用双引号括起来,这样您就可以将要用 WHERE 子句查询的字符串放在单引号中。
我还从 AWS 文档中看到了这个 site,它更详细地解释了 S3 SELECT
命令!
希望对您有所帮助!
我正在尝试从使用 AWS S3 SelectObjectContent
和 SQL 表达式以 CSV 格式存储的数据发出 select 请求。我正在与 Laravel 6.
当我从 object ('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 存储桶下载)时,在第一行中我找到了 headers comma-separated,如我所料:continent,country,user_name,created_at
我也尝试使用位置 headers 并将表达式更改为 '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.
我不知道如何进行。我已经看到这个 post,但它没有帮助。也许有人有线索?请随时告诉我您可能需要哪些更多信息来帮助我解决此问题!
提前致谢!
编辑
我尝试通过 AWS 控制台查询 csv 文件,一切正常:我在其中使用文件 header 信息的 SQL 表达式以及我使用位置 headers 代替。在我的控制器中传输 SQL 表达式我得到了我上面提到的相同错误:
查询 'SELECT * FROM S3Object WHERE continent = "Europe"'
(和 'FileHeaderInfo' => 'USE'
)
无效列索引 查询 'SELECT * FROM S3Object s WHERE s_1 = "Europe"'
(和 'FileHeaderInfo' => 'NONE'
)
我刚刚解决了。
问题是 SQL 表达式的 WHERE
子句中显然只允许使用单引号。
下面是对我有用的所有表达方式:
1.用 'FileHeaderInfo' => 'USE'
'Expression' => "SELECT * FROM S3object WHERE continent = 'Europe'"
2。 With 'FileHeaderInfo' => 'NONE' (positional headers & S3 object 别名)
'Expression' => "SELECT * FROM S3object s WHERE s._1 = 'Europe'"
3。 With 'FileHeaderInfo' => 'NONE' (positional header without S3 object alias)
'Expression' => "SELECT * FROM S3object WHERE _1 = 'Europe'"
注意: 重要的是将实际查询用双引号括起来,这样您就可以将要用 WHERE 子句查询的字符串放在单引号中。
我还从 AWS 文档中看到了这个 site,它更详细地解释了 S3 SELECT
命令!
希望对您有所帮助!