[英]How to parse JSONs in Hive with Mixed Struct/String values for a single field?
我有 JSON 数据,其结构类似于:
root
|-- TX: struct (nullable = true)
| |-- ARGS: array (nullable = true)
| | |-- element: string (containsNull = true)
| |-- COOKIE: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- name: string (nullable = true)
| | | |-- value: string (nullable = true)
数据的实际格式化方式, ARGS
数组包含结构(名称-值对,就像COOKIE
数组一样),如下所示:
ARGS: {"name": "url", "value": "/index.html"}
但是,在文件的某些行中, ARGS
数组仅包含 null 值,这迫使 Hive 将其解释为字符串:
ARGS: null
因为我知道ARGS
中的所有非空值都是结构,所以我在 Hive 中使用CREATE
语句,如下所示:
CREATE EXTERNAL TABLE ${db}.${table}(
tx struct<
args:array<struct<name:string,value:string>>,
cookie:array<struct<name:string,value:string>>
>
) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION '${uri}';
由于这里的最终目标是横向化键值对数组,因此我使用这样的查询来测试:
SELECT array_pairs.name, array_pairs.value
FROM ${db}.${table}
LATERAL VIEW EXPLODE(tx.args) EXPLODED_TABLE AS array_pairs;
如果我只查看 Hue 中的前 100 行左右,这很好用。 但是,如果我尝试将其导出为 CSV 或使用读取整个表的WHERE
子句,Hive 由于数据类型不匹配而弹出此错误:
errorMessage='java.lang.Error: Data is not JSONObject but java.lang.String with value alpha'
我知道最好的答案是拥有一个完美的数据源,但在这种情况下,数据就是它本来的样子,我必须解析它。 有关如何使用 Hive 解析处理 JSON 中的 null 值的任何提示?
编辑 2019 年 10 月 24 日 07:43
感谢@leftjoin,我意识到除了 null 值之外,还有一个或两个 JSON 对象,其中ARGS
字段由数组中的单个字符串填充:
ARGS: ["string value"]
鉴于此,有什么方法可以让 Hive 解析器忽略这些字符串,以便提取键值对?
尝试设置SerDe 属性以忽略格式错误的 JSON:
ALTER TABLE json_table SET SERDEPROPERTIES ( "ignore.malformed.json" = "true");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.