hive 非正确json格式字段造成查询错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive 非正确json格式字段造成查询错误相关的知识,希望对你有一定的参考价值。

参考技术A hive查询报错:

错误发生在对表dw.rec_click_jv的查询,该表直接加载json格式的hdfs文件,建表语句:

进一步追踪,发现在查询字段algInfo时才会出现此错误,该字段格式为:map<STRING,STRING>,遇到数据内容为非法json时便会抛出异常:

将dw.rec_click_jv表的algInfo字段的数据类型修改为STRING,即可解决查询异常问题,但下游表仍有将该字段的数据类型定义为map<STRING,STRING>的需求,可以通过hive函数str_to_map直接将STRING类型的字段转换为map后写入。

下游表定义:

str_to_map函数定义如下:

需要注意的是,在使用str_to_map前 ,需要将数据中的json字符串中的花括号、双引号、逗号、冒号等替换掉:

使用数据集从 Hive 中的字符串中提取 json 字段

【中文标题】使用数据集从 Hive 中的字符串中提取 json 字段【英文标题】:Extracting json field from string in Hive using dataset 【发布时间】:2019-05-30 18:25:42 【问题描述】:

我正在尝试一个非常基本的配置单元查询。我正在尝试从数据集中提取 json 字段,但我总是得到 ​​p>

\N

对于 json 字段,但是 some_string 没问题

这是我的查询:

WITH dataset AS (
SELECT
CAST(
   ' "traceId": "abc", "additionalData": "\"Star Rating\":\"3\"",  "locale": "en_US", "content":  "contentType": "PB", "content": "T S", "bP":  "mD":  "S R": "3" , "cType": "T_S", "sType": "unknown-s", "bTimestamp": 0, "title": "T S"  
    ' AS STRING) AS some_string
)
SELECT some_string, get_json_object(dataset.some_string, '$.traceId') FROM dataset

问题:如何在此处获取 json 字段?

【问题讨论】:

有效:demo.gethue.com/hue/editor?editor=342256 对不起,我想我把它简化了。 json 中的附加数据给出了问题。虽然它是一个有效的 json。仍然失败。我已更新查询以将 addtionalData 添加到查询中的 json 【参考方案1】:

问题在于反斜杠。单个反斜杠被视为 " 的转义字符并被 Hive 删除:

hive> select '\"';
OK
"
Time taken: 0.069 seconds, Fetched: 1 row(s)

当你有两个反斜杠时,Hive 会删除一个:

hive> select '\\"';
OK
\"
Time taken: 0.061 seconds, Fetched: 1 row(s)

使用两个反斜杠可以正常工作:

WITH dataset AS (
  SELECT
  CAST(
     ' "traceId": "abc", "additionalData": "\\"Star Rating\\":\\"3\\"",  "locale": "en_US", "content":  "contentType": "PB", "content": "T S", "bP":  "mD":  "S R": "3" , "cType": "T_S", "sType": "unknown-s", "bTimestamp": 0, "title": "T S"  
       ' AS STRING) AS some_string
   )
   SELECT some_string,  get_json_object(dataset.some_string, '$.traceId') FROM dataset;
OK
 "traceId": "abc", "additionalData": "\"Star Rating\":\"3\"",  "locale": "en_US", "content":  "contentType": "PB", "content": "T S", "bP":  "mD":  "S R": "3" , "cType": "T_S", "sType": "unknown-s", "bTimestamp": 0, "title": "T S"  
       abc
Time taken: 0.788 seconds, Fetched: 1 row(s)

您还可以在附加数据中轻松删除 之前和 之后的双引号:

WITH dataset AS (
SELECT
regexp_replace(regexp_replace(
   ' "traceId": "abc", "additionalData": "\"Star Rating\":\"3\"",  "locale": "en_US", "content":  "contentType": "PB", "content": "T S", "bP":  "mD":  "S R": "3" , "cType": "T_S", "sType": "unknown-s", "bTimestamp": 0, "title": "T S"  
    ' ,'\\"\\','\\') ,'\\\\"','\\' )AS some_string
)
SELECT some_string,  get_json_object(dataset.some_string, '$.traceId') FROM dataset;

返回:

OK
 "traceId": "abc", "additionalData": "Star Rating":"3",  "locale": "en_US", "content":  "contentType": "PB", "content": "T S", "bP":  "mD":  "S R": "3" , "cType": "T_S", "sType": "unknown-s", "bTimestamp": 0, "title": "T S"  
       abc
Time taken: 7.035 seconds, Fetched: 1 row(s)

【讨论】:

以上是关于hive 非正确json格式字段造成查询错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 hive 查询查找 hive json 数组字段的长度

MySQL JSON数据类型操作

hive表加载csv格式数据或者json格式数据

MySQL JSON数据类型操作

hive 分区表

hive客户端表字段查询中文乱码该怎么解决?