HIVE处理JSON数据:GET_JSON_OBJECT、JSON_TUPLE、JSONFILE

本文介绍了如何在Hive中使用GET_JSON_OBJECT函数进行深层解析JSON数据,以及JSON_TUPLE函数的高效一次性解析特性。内容涵盖了JSON数据结构、样例分析和不同版本的建表语法,重点讲解了如何创建、查询和操作JSON表。

概述

  • JSON(JavaScript Object Notation, JS 对象简谱)
    是一种轻量级的数据交换格式
    采用完全独立于编程语言的文本格式来存储和表示数据
  • 样例
{
    "is_del": true,
    "id": {
        "id": "a1"
    },
    "p": [{
        "hp": 9,
        "mp": 7
    }, {
        "hp": 8,
        "mp": 8
    }]
}

解析JSON的函数

  • HIVE版本:3.1.2
CREATE OR REPLACE VIEW v AS
SELECT '{"is_del":true,"id":{"id":"Z"},"p":[{"hp":9,"mp":7},{"hp":8,"mp":8}]}' AS js;

GET_JSON_OBJECT

  • 返回值类型是字符串
  • 可深层解析
SELECT
  GET_JSON_OBJECT(js,'$.is_del'),
  GET_JSON_OBJECT(js,'$.id.id'),
  GET_JSON_OBJECT(js,'$.p[0].hp'),
  GET_JSON_OBJECT(js,'$.p[0].mp'),
  GET_JSON_OBJECT(js,'$.p[1].hp'),
  GET_JSON_OBJECT(js,'$.p[1].mp')
FROM v;

结果

JSON_TUPLE函数

  • 只进行一次解析,比多次调用GET_JSON_OBJECT的效率高
  • UDTF,可以和LATERAL VIEW结合使用
  • 返回值类型是字符串
  • 列名默认值:c0c1c2……
  • 貌似只能解析1层
SELECT JSON_TUPLE(v.js,'is_del','id','p') FROM v;

结果

SELECT t.* FROM v
LATERAL VIEW JSON_TUPLE(v.js,'is_del','id','p')t AS a,b,c;

结果

JSON表

什么是JSON表

  • JSON表是HIVE中的一种存储格式
    是JSON文件格式存储的

  • 4.0.0版本建表语法

STORED AS JSONFILE
  • 3.1.2版本建表语法
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'
STORED AS TEXTFILE

示例

  • 数据样貌
{"is_del":true,"id":{"id":"a1"},"p":[{"hp":9,"mp":7},{"hp":8,"mp":8}]}
{"is_del":false,"id":{"i":"a2"},"p":[{"hp":5,"mp":4},{"hp":3,"mp":3}]}
  • 创建数据文件
echo '{"is_del":true,"id":{"id":"a1"},"p":[{"hp":9,"mp":7},{"hp":8,"mp":8}]}' >/tmp/a
echo '{"is_del":false,"id":{"i":"a2"},"p":[{"hp":5,"mp":4},{"hp":3,"mp":3}]}' >>/tmp/a
cat /tmp/a
  • 创建JSON表,导入数据,查询数据
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1`(
  `is_del` STRING,
  `id`     MAP<STRING,STRING>,
  `p`      ARRAY<STRUCT<mp:INT,hp:INT>>)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe';
LOAD DATA LOCAL INPATH '/tmp/a' OVERWRITE INTO TABLE t1;
SELECT * FROM t1;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值