标签: amazon-athena

亚马逊雅典娜和压缩的S3文件

我有一个带有几个压缩CSV文件的S3存储桶(利用率日志.)我想用Athena查询这些数据,但输出完全是乱码.

似乎Athena试图解析zip文件而不首先解压缩它们.是否有可能强制Hive将我的文件识别为压缩数据?

amazon-web-services amazon-athena

11
推荐指数
1
解决办法
6168
查看次数

在AWS Athena中将多个元素存储在json文件中

我有一些存储在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文件的每个元素作为一个条目读取?

编辑:如何读取图像的每个子列,即地图的每个元素?

谢谢.

sql json amazon-web-services amazon-athena

11
推荐指数
1
解决办法
3455
查看次数

Athena 在 msck 修复表后不添加分区

我有一个 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?

hive amazon-athena

11
推荐指数
2
解决办法
8471
查看次数

AWS Glue 无法从爬网程序创建数据库:权限被拒绝

我正在尝试在 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)

amazon-web-services amazon-athena aws-glue

11
推荐指数
2
解决办法
8490
查看次数

AWS Athena 分区获取所有路径

最近,当分区数量非常多时,我遇到了 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 路径,我的意思是这将是分区的一种神奇方式。也许它获取所有路径

  • 有没有人知道解决方法,或者我们是否以错误的方式使用 Athena?
  • Athena 是否应该仅用于少量分区?

编辑

为了澄清上述声明,我从支持邮件中添加了一段。

来自支持

... 你提到你的新系统有 360000,这是一个很大的数字。因此,当您执行此操作时select …

amazon-web-services nosql presto amazon-athena aws-glue

11
推荐指数
1
解决办法
776
查看次数

如何将带有NULL值的带引号的CSV读入Amazon Athena

我正在尝试使用存储在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(引用对于我的真实数据更为复杂,因为我的实际数据要复杂得多)?

amazon-athena

10
推荐指数
1
解决办法
6278
查看次数

AWS Athena创建表和分区

我将传感器数据存储在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)

hive amazon-s3 amazon-web-services amazon-athena

10
推荐指数
2
解决办法
3419
查看次数

(Presto)窗口函数“OVER”子句中“ROWS BETWEEN”和“RANGE BETWEEN”的区别

这个问题主要是关于旧版本的 PrestoSQL,它已在(现已重命名)Trino 项目中从版本 346 开始解决。但是,亚马逊的 Athena 项目基于 Presto 版本 0.217(Athena Engine 2)和 0.172(Athena Engine 1) ),它确实存在下面描述的问题。这个问题是专门围绕 Athena Engine 1 / PrestoSQL 0.172 版编写的

问题(tl;博士)

  1. Presto 窗口函数ROWS BETWEENRANGE BETWEENPresto 窗口函数有什么区别?
    • 这些只是彼此的同义词,还是存在核心概念差异?
    • 如果它们只是同义词,为什么ROWS BETWEEN允许比RANGE BETWEEN?
  2. 是否存在可以在ROWS BETWEEN和上使用完全相同的参数RANGE BETWEEN并获得不同结果的查询场景?
    • 如果只使用unbounded/ current row,是否有您会使用RANGE而不是ROWS(或反之亦然)的场景?
  3. 既然ROWS有更多选择,为什么文档中根本没有提到它?o_o

注释

急文档是相当安静的约什RANGE,并没有提及ROWS。我在 Presto 中没有找到很多关于窗口函数的讨论或示例。我开始通过 Presto 代码库来尝试解决这个问题。希望有人能帮我避免这种情况,我们可以一起改进文档。

通过Presto代码有一个解析器测试用例ROWS变种,但有 …

window-functions presto amazon-athena trino

10
推荐指数
1
解决办法
6748
查看次数

AWS Athena:通过数组的结构的属性进行查询

我使用 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 爬虫以仅添加数组中的元素并避免完全嵌套?

amazon-web-services amazon-athena aws-glue-data-catalog

10
推荐指数
1
解决办法
2万
查看次数

将 Athena SQL 与正则表达式结合使用

我正在使用 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" =也无法开始工作。

sql amazon-athena

10
推荐指数
2
解决办法
3万
查看次数