我有一个带有几个压缩CSV文件的S3存储桶(利用率日志.)我想用Athena查询这些数据,但输出完全是乱码.
似乎Athena试图解析zip文件而不首先解压缩它们.是否有可能强制Hive将我的文件识别为压缩数据?
我有一些存储在S3存储桶中的json文件,其中每个文件都有多个结构相同的元素.例如,
[{"eventId":"1","eventName":"INSERT","eventVersion":"1.0","eventSource":"aws:dynamodb","awsRegion":"us-west-2","image":{"Message":"New item!","Id":101}},{"eventId":"2","eventName":"MODIFY","eventVersion":"1.0","eventSource":"aws:dynamodb","awsRegion":"us-west-2","image":{"Message":"This item has changed","Id":101}},{"eventId":"3","eventName":"REMOVE","eventVersion":"1.0","eventSource":"aws:dynamodb","awsRegion":"us-west-2","image":{"Message":"This item has changed","Id":101}}]
Run Code Online (Sandbox Code Playgroud)
我想在Athena中创建一个与上述数据相对应的表格.
我写的用于创建表的查询:
CREATE EXTERNAL TABLE IF NOT EXISTS sampledb.elb_logs2 (
`eventId` string,
`eventName` string,
`eventVersion` string,
`eventSource` string,
`awsRegion` string,
`image` map<string,string>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1',
'field.delim' = ' '
) LOCATION 's3://<bucketname>/';
Run Code Online (Sandbox Code Playgroud)
但如果我按如下方式进行SELECT查询,
SELECT * FROM sampledb.elb_logs4;
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
1 {"eventid":"1","eventversion":"1.0","image":{"id":"101","message":"New item!"},"eventsource":"aws:dynamodb","eventname":"INSERT","awsregion":"us-west-2"} {"eventid":"2","eventversion":"1.0","image":{"id":"101","message":"This item has changed"},"eventsource":"aws:dynamodb","eventname":"MODIFY","awsregion":"us-west-2"} {"eventid":"3","eventversion":"1.0","image":{"id":"101","message":"This item has changed"},"eventsource":"aws:dynamodb","eventname":"REMOVE","awsregion":"us-west-2"}
Run Code Online (Sandbox Code Playgroud)
json文件的全部内容在此处作为一个条目被选中.
如何将json文件的每个元素作为一个条目读取?
编辑:如何读取图像的每个子列,即地图的每个元素?
谢谢.
我有一个 Firehose 将数据存储在 s3 中的默认目录结构中:“YY/MM/DD/HH”和 athena 中的一个表,这些列定义为分区:
年:字符串,月:字符串,日:字符串,小时:字符串
跑完后
msck repair table clicks
Run Code Online (Sandbox Code Playgroud)
我只收到:
Partitions not in metastore: clicks:2017/08/26/10
Run Code Online (Sandbox Code Playgroud)
我可以手动添加这些分区并且一切正常,但是我想知道为什么 msck repair 不会自动添加这些分区并更新 Metastore?
我正在尝试在 S3 存储桶上使用 AWS Glue 爬网程序来填充 Glue 数据库。我运行 Create Crawler 向导,选择我的数据源(带有 avro 文件的 S3 存储桶),让它创建 IAM 角色并运行它,但我收到以下错误:
Database does not exist or principal is not authorized to create tables. (Database name: zzz-db, Table name: avroavro_all) (Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: 78fc18e4-c383-11e9-a86f-736a16f57a42). For more information, see Setting up IAM Permissions in the Developer Guide (http://docs.aws.amazon.com/glue/latest/dg/getting-started-access.html).
Run Code Online (Sandbox Code Playgroud)
我尝试在一个新的空白数据库中创建这个表(而不是现有的带有表的数据库),我尝试为名称添加前缀,尝试获取不同的模式,并尝试使用具有管理员访问权限的现有角色。我虽然后者可以工作,但我一直收到同样的错误,不知道为什么。
明确地说,我创建的服务角色有几个策略,我假设一个足以创建表的前提:
日志是香草:
?
19:52:52
[10cb3191-9785-49dc-8935-fb02dcbd69a3] BENCHMARK : Running Start Crawl for Crawler avro
19:53:22
[10cb3191-9785-49dc-8935-fb02dcbd69a3] BENCHMARK : Classification complete, writing …Run Code Online (Sandbox Code Playgroud) 最近,当分区数量非常多时,我遇到了 AWS Athena 问题。
旧版本的数据库和表只有 1 个分区级别,比如 id=x。我们拿一张桌子;例如,我们存储每个 id(产品)的支付参数,并且没有很多 ID。假设它在 1000-5000 左右。现在,在查询该表时,在 where 子句上传递 id 号,例如“.. where id = 10”。实际上,查询返回的速度非常快。假设我们每天更新数据两次。
最近,我们一直在考虑为一天添加另一个分区级别,例如“../id=x/dt=yyyy-mm-dd/..”。这意味着如果一个月过去了,分区数每天增长 xID 倍,如果我们有 3000 个 ID,我们每月大约会得到 3000x30=90000 个分区。因此,分区数量迅速增长。
假设 3 个月前的数据(约 27 万个分区),我们希望看到如下查询最多在 20 秒左右返回。
select count(*) from db.table where id = x and dt = 'yyyy-mm-dd'
这需要一分钟。
真实案例
事实证明,Athena 首先获取所有分区(元数据)和 s3 路径(无论使用 where 子句),然后过滤您希望在 where 条件下查看的那些 s3 路径。第一部分(按分区获取所有 s3 路径的持续时间与分区数量成正比)
您拥有的分区越多,执行查询的速度就越慢。
直觉上,我希望 Athena 只获取 where 子句中规定的 s3 路径,我的意思是这将是分区的一种神奇方式。也许它获取所有路径
编辑
为了澄清上述声明,我从支持邮件中添加了一段。
来自支持
... 你提到你的新系统有 360000,这是一个很大的数字。因此,当您执行此操作时
select …
我正在尝试使用存储在S3上的引用CSV文件在Athena中创建外部表.问题是,我的CSV包含应该作为INT读取的列中的缺失值.简单的例子:
CSV:
id,height,age,name
1,,26,"Adam"
2,178,28,"Robert"
Run Code Online (Sandbox Code Playgroud)
创建表定义:
CREATE EXTERNAL TABLE schema.test_null_unquoted (
id INT,
height INT,
age INT,
name STRING
)
ROW FORMAT
SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ",",
'quoteChar' = '"',
'skip.header.line.count' = '1'
)
STORED AS TEXTFILE
LOCATION 's3://mybucket/test_null/unquoted/'
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE语句运行正常,但一旦我尝试查询表,我就得到了HIVE_BAD_DATA: Error parsing field value ''.
我试着让CSV看起来像这样(引用空字符串):
"id","height","age","name"
1,"",26,"Adam"
2,178,28,"Robert"
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
试图指定'serialization.null.format' = ''的SERDEPROPERTIES-不工作.
尝试指定相同的通过TBLPROPERTIES ('serialization.null.format'='')- 仍然没有.
当你指定所有列时,它可以工作,STRING但这不是我需要的.
因此,问题是,是否有任何方法可以使用正确的列规范读取带引号的CSV(引用对于我的真实数据更为复杂,因为我的实际数据要复杂得多)?
我将传感器数据存储在S3中(每5分钟写入一次数据):
farm_iot/sensor_data/farm/farm0001/sensor01/1541252701443
Run Code Online (Sandbox Code Playgroud)
1541252701443是一个包含度量的json文件:
{ "temperature": 14.78, "pressure": 961.70, "humidity": 68.32}
Run Code Online (Sandbox Code Playgroud)
我肯定错过了一些蜂巢技能.不幸的是,我没有找到一个提取我的时间序列json数据的例子.我也不确定Hive/Athena确实支持这种数据摔跤.
我正在为这个数据创建一个Athena表格...
CREATE EXTERNAL TABLE IF NOT EXISTS farm.sensor_data (
device string,
sensor string,
data_point string,
value double
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://farm-iot/sensor_data/farm/farm0001/sensor01/'
PARTITIONED BY (timestamp string)
TBLPROPERTIES ('has_encrypted_data'='false')
Run Code Online (Sandbox Code Playgroud)
我想的另一条道路是将数据存储在一个更容易处理的结构中/也许我没有足够的数据分区??!
所以也许我应该像这样添加dt到结构:
farm_iot/sensor_data/2018-11-03-02-45-02/farm/farm0001/sensor01/1541252701443
Run Code Online (Sandbox Code Playgroud)
仍然没有让我到达我想要的地方:
+---------------+----------+----------+-------------+--------+
| timestamp | device | sensor | data_point | value |
+---------------+----------+----------+-------------+--------+
| 1541252701443 | farm0001 | sensor01 | temperature | 14.78 |
+---------------+----------+----------+-------------+--------+
| …Run Code Online (Sandbox Code Playgroud) 这个问题主要是关于旧版本的 PrestoSQL,它已在(现已重命名)Trino 项目中从版本 346 开始解决。但是,亚马逊的 Athena 项目基于 Presto 版本 0.217(Athena Engine 2)和 0.172(Athena Engine 1) ),它确实存在下面描述的问题。这个问题是专门围绕 Athena Engine 1 / PrestoSQL 0.172 版编写的
ROWS BETWEEN和RANGE BETWEENPresto 窗口函数有什么区别?
ROWS BETWEEN允许比RANGE BETWEEN?ROWS BETWEEN和上使用完全相同的参数RANGE BETWEEN并获得不同结果的查询场景?
unbounded/ current row,是否有您会使用RANGE而不是ROWS(或反之亦然)的场景?ROWS有更多选择,为什么文档中根本没有提到它?o_o该急文档是相当安静的约什RANGE,并没有提及ROWS。我在 Presto 中没有找到很多关于窗口函数的讨论或示例。我开始通过 Presto 代码库来尝试解决这个问题。希望有人能帮我避免这种情况,我们可以一起改进文档。
我使用 awsglue 爬取数据,从 s3 文件夹导入 json 数据,该文件夹包含根大括号是如下数组的数据:
[{id: '1', name: 'rick'},{id: '2', name: 'morty'}]
Run Code Online (Sandbox Code Playgroud)
这最终会产生这样的模式:
array<struct<expand:string,id:string,name:string>>
Run Code Online (Sandbox Code Playgroud)
如何name在 Athena 中查询?
如果我尝试这个:
SELECT * FROM people_s3_buckets WHERE name = "rick";
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
SYNTAX_ERROR: Column 'name' cannot be resolved
Run Code Online (Sandbox Code Playgroud)
也许,有一种方法可以设置 Glue 爬虫以仅添加数组中的元素并避免完全嵌套?
我正在使用 DbVisualizer 连接到 athena 实例。我有一个有效的查询:
SELECT device, description, id, size, date FROM test.database WHERE month = '01'
and device not like '%link%'
and device not like '%Link%'
and device not like '%LINK%'
and id not like '%abc%'
and id not like '%Abc%'
and id not like '%ABC%'
group by device, description, id, size, date order by month desc
Run Code Online (Sandbox Code Playgroud)
我想做的就是清理它并使用正则表达式捕获案例。我很确定 /link.*/ig并且/abc.*/ig会发现情况会改变它,但我不知道如何将其插入。我"input.regex" =也无法开始工作。