【问题标题】:Aws Athena - is it possible to query a JSON property that has dots in nameAws Athena - 是否可以查询名称中有点的 JSON 属性
【发布时间】:2020-01-27 22:25:29
【问题描述】:

我使用 Athena 在 S3 中查询存储在 JSON 对象中的数据。

一些 JSON 属性的名称中包含点,它们代表 Android 应用程序名称。

属性看起来是这样的:

{
  "MessageTime": "2019-09-24T16:07:16+00:00",
  "Memory": {
    "com.google.android.gms.maps": {
      "Min": 0,
      "Max": 0,
      "Avg": 0
    }
  }
}

具有该列的 AWS Athena 表创建成功,可以查询。 有没有办法在 SQL 查询中引用 Memory.com.google.android.gms.maps.Min 属性?

也许我可以在创建表等时以某种方式重命名此列?

我可以轻松查询其他嵌入式属性(名称中不带点)。

【问题讨论】:

  • 根据 SQL 标准,当引用带有点的列时,您需要"-引用名称。例如。 SELECT "Memory.com.google.android.gms.maps.Min" FROM ....
  • 试过了,Athena 返回 - SYNTAX_ERROR: line 9:40: Column '...' cannot be resolved
  • 当你SHOW COLUMNS(docs.aws.amazon.com/athena/latest/ug/show-columns.html)时,这个栏目是怎么列出来的?
  • 在这种情况下只显示外部列名,我看到Memory
  • 试试"Memory"."com.companyname.appname1"."Min"(或"Memory"."com.google.android.gms.maps"."Min")。

标签: amazon-web-services amazon-athena


【解决方案1】:

这取决于表的创建方式。

  • 如果有Memory 类型为string 的列,您可以使用json_extract 获取值:json_extract("Memory", '$[\'com.google.android.gms.maps\'].Min')
  • 如果有Memory 类型为map<string,string> 的列,您可以使用element_atjson_extract 的组合:json_extract(element_at("Memory", 'com.google.android.gms.maps'), '$.Min')
  • 如果有Memory 类型为map<string,struct<Min:int,Max:int,Avg:int>> 的列,您可以使用element_at 和点来访问值:element_at("Memory", 'com.google.android.gms.maps').Min

我不确定如何将Memory 列声明为struct,也许可以在该语法中转义点,但我不确定如何。无论哪种方式,它看起来都不是 struct 类型的结构,它看起来更像是一张地图。

【讨论】:

  • Memory 定义为map<string,struct<Min:int,Max:int,Avg:int>>。谢谢你的帮助。
  • 我不得不使用双引号来访问使用json_extractjson_extract("Memory", '$["com.google.android.gms.maps"].Min')的字段
猜你喜欢
  • 2019-06-28
  • 2017-09-04
  • 1970-01-01
  • 2019-06-02
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2021-10-18
相关资源
最近更新 更多