4

Amazon S3 有一项名为的新功能select from,它允许对简单数据文件(如 CSV 或 JSON)运行简单的 SQL 查询。所以我想我会尝试一下。

我创建了以下 CSV 并将其上传到我在俄勒冈州的 S3 存储桶(我认为这个文件非常简单):

aaa,bbb,ccc
111,111,111
222,222,222
333,333,333

我指出这是带有标题行的 CSV,并发出以下 SQL:

从 s3object 中选择 *

...按预期工作,返回:

111,111,111
222,222,222
333,333,333

然后我尝试了提供的示例查询之一,但失败了:

select s._1, s._2 from s3object s

...错误消息是“文件中缺少查询中的某些标头。请检查文件并重试。”。

还尝试了以下方法,每次都收到相同的错误:

select aaa from s3object s
select s.aaa from s3object s
select * from s3object s where aaa = 111
select * from s3object s where s.aaa = 111
select * from s3object s where s._1 = 111

因此,每当我的查询在 SELECT 或 WHERE 子句中按名称或编号引用列时,我都会得到“查询中的标题丢失”。AWS 文档没有提供有关此错误的后续信息。

所以我的问题是,怎么了?是否有关于列标题的未记录要求?是否有未记录的方式来引用列?“选择来源”功能是否有错误?

4

3 回答 3

4

我做了以下事情:

  • 使用上面显示的内容创建了一个文件
  • 在文件上输入 S3 Select,并勾选File has header row
  • 没有改变其他设置

这些查询不起作用:

select s._1, s._2 from s3object s
select * from s3object s where s._1 = 111

它们不起作用的原因是文件包含标题,因此列具有实际名称。

这些查询确实有效:

select aaa from s3object s
select s.aaa from s3object s
select * from s3object s where aaa = 111 (Gave empty result)
select * from s3object s where s.aaa = 111 (Gave empty result)

当我将最后两个查询视为字符串时,它们按预期返回了该行:

select * from s3object s where aaa = '111'
select * from s3object s where s.aaa = '111'
于 2018-06-09T06:11:17.097 回答
0

s3select将所有内容都视为字符串。查询

select * from s3object s where cast(aaa as int) = 111
select * from s3object s where cast(s.aaa as int) = 111

如果标题行被适当地选中/取消选中,则应该返回预期的结果。

于 2021-08-18T16:06:56.887 回答
0

回到这一点,我一时兴起决定用一个新的相同示例文件替换这个示例文件,现在我没有遇到这个问题。事实上,我无法复制我最初发布的问题。

我有一些理论:字符编码、行尾字符以及我的原始文件中可能存在额外的行,但我无法重新创建原始问题。

我尝试了不同的编辑器来创建源文件,我尝试了 unix vs windows 行尾字符,我尝试了最后的额外行,我尝试了大写与小写列标题,我已经尝试了不同的地区。现在一切正常,所以我完全不知道为什么它一开始就不起作用。

生活仍在继续。感谢大家的努力。

于 2018-06-20T14:27:21.420 回答