雅典娜:仅使用JSON字段的子集

时间:2018-12-18 14:55:34

标签: json parquet amazon-athena

我有一个非常复杂的嵌套JSON日志。我想基于这些日志创建一个Athena外部表,但仅使用表中的JSON字段中的某些。

我有两个问题:

  1. 即使我不需要那里的大多数字段,我是否仍需要使用嵌套结构创建一个完整的复杂DDL?
  2. 假设我可以做到,并且我将JSON日志以Parquet格式存储在S3中-雅典娜会只扫描我指定的日志的那些部分/字段吗?还是以全价进行全面扫描? :-)

一个简化的JSON事件示例:

{
  "name": "n1",
  "f1": "v1",
  "group1": {
     "g1F1": "v1",
     "g1F2": "v2",
     "group11": {
         "g11F1": "v1",
         "g11F2": "v2"
     },
     "group12": {
         "g12F1": "v1",
         "g12F2": "v2"
     }
   },
   "group2": {
     "g2F1": "v1",
     "g2F2": "v2",
      ...
   },
   ...
}  

可以说我只对顶级字段“名称”,“ f1”和一些嵌套字段感兴趣,例如“ group2”的字段“ g2F1”和“ g2F2”。 我可以做这样的事情吗?

CREATE EXTERNAL TABLE mytable (
  name string,
  f1 string,
  group2 struct<g2F1: string, g2F2: string>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://<mybucket>'

当我尝试这种方法时-DDL运行没有错误,表已创建,但是'select * from mytable'不会返回结果...

谢谢!


更新:

问题/问题1的解决方案: 不知道为什么,但是一旦我将gzip压缩的日志重新上传到S3中,表创建和查询就开始工作了!

第2个问题-请参见下面的Tanveer的答案。


更新2:

对于那些也在考虑此选项的人:我用大约6G的压缩数据创建了Athena表-一切都很好。但是,查询执行时间非常长。一个简单的查询,在几个字段上使用过滤器,大约需要25-30分钟。...考虑到这只是一个使用6G的POC,而我实际需要几百个Ts-此选项对我来说不可行用例。当然,我没有使用Parquet格式-但由于我经常需要使用大多数列,因此我认为使用Parquet不会大大提高我的查询性能。

1 个答案:

答案 0 :(得分:1)

下面的答案。

  1. 您的查询未返回数据的原因,因为Athena不喜欢json数据中的换行符。您的表定义是完美的,您无需在整个数据上创建表定义。这就是读取架构的好处。您的整个数据应与以下相同。然后您的Athena查询将返回数据。不要灰心。由于Glue ETL在后台运行Spark,因此Glue ETL可以读取带换行符的json文件。因此,您可以使用Glue ETL将json文件转换为实木复合地板,然后在实木复合地板数据之上创建Athena表。

    {“ name”:“ n1”,“ f1”:“ v1”,“ group1”:{“ g1F1”:“ v1”,“ g1F2”:“ v2”,“ group11”:{“ g11F1”: “ v1”,“ g11F2”:“ v2”},“ group12”:{“ g12F1”:“ v1”,“ g12F2”:“ v2”}},“ group2”:{“ g2F1”:“ v1”,“ g2F2“:” v2“}}

  2. 将数据转换为拼合形式后,您将仅为查询中使用的列付费,而不是为here所述的整个表付费。