我试图了解aws athena服务和新发布的s3 select之间的区别(仍在预览中).那两个用户的用途有何不同?这似乎都有助于从s3中选择部分数据.
amazon-s3 amazon-web-services amazon-athena amazon-s3-select
我尝试在 AWS S3 SELECT Web UI 中选择 CSV,但收到以下错误消息:
Quoted record delimiter found in the file. To allow quoted record delimiters, please set AllowQuotedRecordDelimiter to 'TRUE'.
Run Code Online (Sandbox Code Playgroud)
但没有选项可以AllowQuotedRecordDelimiter
设置TRUE
请指教
我正在测试S3 Select,据我所知,从示例中,您可以将单个对象(CSV或JSON)视为数据存储.
我希望每个S3对象都有一个JSON文档,并将整个存储桶搜索为"数据库".我将每个'文件'保存为,<ID>.json
并且每个文件都具有相同模式的JSON文档.
是否可以在一次通话中搜索多个对象?即查找所有JSON文档where customerId = 123
?
我打算使用 Python 对存储在 S3 中的非常大的 csv 文件执行一些内存密集型操作,目的是将脚本移动到 AWS Lambda。我知道我可以读入整个 csv nto 内存,但我肯定会遇到 Lambda 的内存和存储限制,有这么大的文件,有什么方法可以使用 boto3 将 csv 的块流式传输或一次读取到 Python 中/ botocore,理想情况下通过指定要读入的行号?
以下是我已经尝试过的一些事情:
1) 使用range
参数 inS3.get_object
指定要读入的字节范围。不幸的是,这意味着最后几行在中间被截断,因为无法指定要读入的行数。有一些混乱的解决方法,例如扫描最后一个换行符,记录索引,然后将其用作下一个字节范围的起点,但如果可能的话,我想避免这种笨拙的解决方案。
2) 使用 S3 select 编写 sql 查询以有选择地从 S3 存储桶中检索数据。不幸的row_numbers
是,不支持 SQL 函数,而且看起来没有办法读取行的子集。
Amazon S3 有一项新功能select from
,允许对简单数据文件(例如 CSV 或 JSON)运行简单 SQL 查询。所以我想我会尝试一下。
我创建了以下 CSV 并将其上传到我位于俄勒冈州的 S3 存储桶(我认为这个文件非常简单):
aaa,bbb,ccc
111,111,111
222,222,222
333,333,333
Run Code Online (Sandbox Code Playgroud)
我指出这是带有标题行的 CSV,并发出以下 SQL:
从 s3object s 选择 *
...按预期工作,返回:
111,111,111
222,222,222
333,333,333
Run Code Online (Sandbox Code Playgroud)
然后我尝试了提供的示例查询之一,但失败了:
select s._1, s._2 from s3object s
Run Code Online (Sandbox Code Playgroud)
...错误消息是“文件中缺少查询中的某些标头。请检查文件并重试。”。
还尝试了以下方法,每次都会收到相同的错误:
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
Run Code Online (Sandbox Code Playgroud)
因此,每当我的查询在 SELECT …
我正在使用 S3 Select 从 S3 Bucket 读取 csv 文件并输出为 CSV。在输出中,我只看到行,但看不到标题。如何获得包含标题的输出。
import boto3
s3 = boto3.client('s3')
r = s3.select_object_content(
Bucket='demo_bucket',
Key='demo.csv',
ExpressionType='SQL',
Expression="select * from s3object s",
InputSerialization={'CSV': {"FileHeaderInfo": "Use"}},
OutputSerialization={'CSV': {}},
)
for event in r['Payload']:
if 'Records' in event:
records = event['Records']['Payload'].decode('utf-8')
print(records)
Run Code Online (Sandbox Code Playgroud)
CSV
Name, Age, Status
Rob, 25, Single
Sam, 26, Married
Run Code Online (Sandbox Code Playgroud)
s3select 的输出
Rob, 25, Single
Sam, 26, Married
Run Code Online (Sandbox Code Playgroud) 我有一个存储在 S3 存储桶中的镶木地板文件。我想获取镶木地板文件的所有列的列表。我正在使用,s3 select
但它只是给了我没有任何列标题的所有行的列表。
有没有办法从这个镶木地板文件中获取所有列名而不完全下载它?由于镶木地板文件可能非常大,我不想下载整个镶木地板文件,这就是为什么我使用s3 select
选择前几行
select * from S3Object LIMIT 10
Run Code Online (Sandbox Code Playgroud)
我试图通过执行显式获取列名
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'S3Object'
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为 AWS S3 尚不支持此功能。
有没有其他方法可以实现相同的目标?
我想知道是否有人想出如何在S3 Select 中跳过行?
SELECT S.* FROM s3object S SKIP 100 LIMIT 200
--or
SELECT * from s3object s LIMIT 5, 10
--or
SELECT * from s3object s limit 5 OFFSET 10
Run Code Online (Sandbox Code Playgroud)
看起来您可以限制返回的记录数
s3 = boto3.client('s3')
bucket = bucket
file_name = file
sql_stmt = """SELECT S.* FROM s3object S LIMIT 10"""
req = s3.select_object_content(
Bucket=bucket,
Key=file,
ExpressionType='SQL',
Expression=sql_stmt,
InputSerialization = {'CSV': {'FileHeaderInfo': 'USE'}},
OutputSerialization = {'CSV': {}},
)
Run Code Online (Sandbox Code Playgroud)
还有一个请求将 OFFSET/SKIP 添加到 s3api,但它被关闭了。
您也可以以字节为单位指定ScanRange,但是如果对象被压缩会发生什么?
它的范围是压缩对象的字节数还是未压缩的对象? …
我正在尝试解析由二元运算符+
、一元运算符not
和标识符组成的表达式,这些标识符可以是任何非字母字符串not
from pyparsing import (
CaselessKeyword,
Combine,
Word,
alphas,
opAssoc,
infixNotation,
)
identifier = Combine(~CaselessKeyword('not') + Word(alphas))
expression = infixNotation(identifier, [
('+', 2, opAssoc.LEFT),
(CaselessKeyword('not'), 1, opAssoc.RIGHT),
]
Run Code Online (Sandbox Code Playgroud)
跑步
expression.parseString('a + (not b)')
Run Code Online (Sandbox Code Playgroud)
给出了我的期望
[['a', '+', ['not', 'b']]]
Run Code Online (Sandbox Code Playgroud)
但是,没有括号
expression.parseString('a + not b')
Run Code Online (Sandbox Code Playgroud)
我只得到第一个令牌:
['a']
Run Code Online (Sandbox Code Playgroud)
我如何定义语言以在没有括号的情况下按照我的意愿工作?
(在实际情况中,有更多的运算符和保留字:这是解析 S3 Select 语言的一步)
我正在尝试使用配置单元连接器和 Minio 对象存储从 Presto 中选择 S3。我能够创建一个外部表并运行所有 SQL 查询。但是,S3 Select 似乎不起作用,即使hive.s3select-pushdown.enabled=true
在目录文件夹中的属性文件中设置。我在 Minio 服务器上运行了一个数据包跟踪,我只看到正在进行的 GET/LIST 调用,没有看到任何POST /{Key+}?select&select-type=2 HTTP/1.1
正在进行的调用。
下面是配置单元属性文件。
hive.metastore.uri=thrift://hadoop-master:9083
hive.s3.path-style-access=true
hive.s3.endpoint=http://X.X.X.X:9000
hive.s3.aws-access-key=minioadmin
hive.s3.aws-secret-key=minioadmin
hive.non-managed-table-writes-enabled=true
hive.storage-format=ORC
hive.s3select-pushdown.enabled=true
Run Code Online (Sandbox Code Playgroud)
我看到 presto 中的 SESSION 参数也设置了相同的设置。
minio.s3_select_pushdown_enabled | true | true
minio.projection_pushdown_enabled | true | true
Run Code Online (Sandbox Code Playgroud)
这就是我从 presto cli 创建外部表的方式。
presto:default> CREATE TABLE nyc_9 ( vendorid VARCHAR, tpep_pickup_datetime VARCHAR, tpep_dropoff_datetime VARCHAR, passenger_count VARCHAR, trip_distance VARCHAR, ratecodeid VARCHAR, store_and_fwd_flag VARCHAR, pulocationid VARCHAR, dolocationid VARCHAR, payment_type VARCHAR, fare_amount VARCHAR, extra VARCHAR, mta_tax VARCHAR, tip_amount …
Run Code Online (Sandbox Code Playgroud)