来自字符串字段的 AWS Athena json_extract 查询返回空值

Posted

技术标签:

【中文标题】来自字符串字段的 AWS Athena json_extract 查询返回空值【英文标题】:AWS Athena json_extract query from string field returns empty values 【发布时间】:2018-11-27 03:18:51 【问题描述】:

我在雅典娜有一张这样结构的桌子

CREATE EXTERNAL TABLE `json_test`(
  `col0` string , 
  `col1` string , 
  `col2` string , 
  `col3` string , 
  `col4` string , 
  )
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ( 
  'quoteChar'='\"', 
  'separatorChar'='\;') 

这样的Json String 存储在“col4”中:

'email': 'test_email@test_email.com', 'name': 'Andrew', 'surname': 'Test Test'

我正在尝试进行 json_extract 查询:

SELECT json_extract(col4 , '$.email') as email FROM "default"."json_test"

但查询返回空值。

任何帮助将不胜感激。

【问题讨论】:

是否引用了 json?我只是问,因为我已经看到 opencsvserde 解析所有数据而不是吐出错误,当你从 json_test 中选择 col4 时,你得到了你所期望的。 Json 没有被引用。如果我从 json_test 中选择 *,我会正确获取所有行 如果你从 json_test 中选择 col4,你会得到包含 json 的 col 吗? 我只是问,因为我刚刚运行了类似的东西并且遇到了问题。 是的,你是对的,我确实从 json_test 中选择 col4 并得到了 json 字符串 【参考方案1】:

JSON 需要使用双引号 (") 将值括起来。

比较:

presto> SELECT json_extract('"email": "test_email@test_email.com", "name": "Andrew"' , '$.email');
            _col0
-----------------------------
 "test_email@test_email.com"

presto> SELECT json_extract('''email'': ''test_email@test_email.com'', ''name'': ''Andrew''', '$.email');
 _col0
-------
 NULL

(注意:SQL varchar 文字中的'' 表示构造值中的单个',因此此处的文字与问题中的格式相同。)

如果您的字符串值是“带单引号的 JSON”,您可以尝试使用 replace(string, search, replace) → varchar 修复它

【讨论】:

【参考方案2】:

问题是存储的 json 字符串的单引号字符

'email': 'test_email@test_email.com', 'name': 'Andrew', 'surname': 'Test Test'

改为双引号

"email": "test_email@test_email.com", "name": "Andrew", "surname": "Test Test"

Athena Query 工作正常:

SELECT json_extract(col4 , '$.email') as email FROM "default"."json_test"

【讨论】:

请将@Piotr Findeisen 的答案标记为正确,因为他是第一个为您提供答案的人

以上是关于来自字符串字段的 AWS Athena json_extract 查询返回空值的主要内容,如果未能解决你的问题,请参考以下文章

AWS Athena 将结构数组导出到 JSON

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

aws athena - 转换为 json 不返回 json 对象

有没有办法在 AWS Athena 中展平结构字段?

AWS DMS:如何处理 Presto/Athena 中的 TIMESTAMP_MICROS parquet 字段

AWS Athena 在此比例因子下超时/资源不足