2

我正在尝试使用 AWS S3SelectObjectContent和 SQL 表达式从以 CSV 格式存储的数据中发出选择请求。我正在使用 Laravel 6。

当我从对象 ( ) 请求所有数据时'Expression' => 'SELECT * from S3Object',一切正常。我检索数据并可以使用它。当我想WHERE在 SQL 表达式中使用 - 子句时会出现问题。

这是我的代码:

$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"'and '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 表达式。在我的控制器中传输 SQL 表达式我得到了我上面提到的相同错误:

查询缺少标题'SELECT * FROM S3Object WHERE continent = "Europe"'(和'FileHeaderInfo' => 'USE'

查询的无效列索引'SELECT * FROM S3Object s WHERE s_1 = "Europe"'(和'FileHeaderInfo' => 'NONE'

4

1 回答 1

3

我刚刚解决了。WHERE问题是在 SQL 表达式的子句中显然只允许使用单引号。

因此,您可以在下面找到所有对我有用的表达式:

1. 使用'FileHeaderInfo' => 'USE'

'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 文档中看到了这个站点SELECT,它更详细地解释了 S3命令!

希望能有所帮助!

于 2020-09-03T10:42:14.550 回答