Hive数仓操作(十三)

一、JSON 数据

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在不同的编程语言之间进行数据传输时非常通用和常用。JSON 格式简单直观,易于阅读和编写,并且可以被大多数编程语言轻松解析和生成。

1. JSON 特点

  1. 轻量级:JSON 的格式简单,数据量较小,适合网络传输。
  2. 可读性强:JSON 使用键值对来表示数据,非常直观,易于人类阅读和编写。
  3. 广泛支持:几乎所有的编程语言(如 JavaScript、Python、Java、C# 等)都支持 JSON,并且有内置或第三方库可以方便地解析和生成 JSON 数据。

2. JSON 的语法

  • 对象:由 {} 包围,使用键值对表示数据,键和值之间用冒号 : 分隔,键值对之间用逗号 , 分隔。

    {
      "name": "John Doe",
      "age": 30,
      "email": "john.doe@example.com"
    }
    
  • 值的类型:可以是字符串、数字、对象、数组、布尔值(true/false)或 null,甚至可以继续嵌套json。

    {
      "string": "hello",
      "number": 123,
      "object": {"key": "value"},
      "array": [1, 2, 3],
      "boolean": true,
      "null_value": null
    }
    

3. JSON 在 Hive 中的使用

在 Hive 中,处理 JSON 数据非常常见,可以使用 get_json_object() 等函数来解析和提取 JSON 数据中的信息。

get_json_object()

get_json_object() 函数用于从 JSON 字符串中提取指定路径的数据。

示例数据文件

假设有一个名为 users.json 的文件,内容如下:

1,{"name": "John", "age": 30}
2,{"name": "Jane", "age": 25}
导入数据到 Hive 表

首先,我们创建一个表 users 并将数据导入到该表中:

-- 创建表
CREATE TABLE users (
    user_id INT,
    user_info STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';

-- 加载数据
LOAD DATA LOCAL INPATH '/path/to/users.json' INTO TABLE users;

然后,使用 get_json_object() 从 JSON 字符串中提取用户的名称和年龄:

SELECT
    user_id,
    get_json_object(user_info, '$.name') as name,
    get_json_object(user_info, '$.age') as age
FROM
    users;
示例结果
user_idnameage
1John30
2Jane25

二、HIVE的JSON 数据处理

在本案例中,我们将介绍如何从JSON格式的数据中提取时间、城市和人名,并将提取的数据进行进一步处理。

示例数据格式

数据表 yizu 中的 cot 字段示例:

1   {"time": 1672531199000, "sex": "male", "searchValue": [{"province": "广东", "city": "深圳"}, "张三"]}
2   {"time": 1672531199001, "sex": "female", "searchValue": [{"province": "北京", "city": "北京"}, "李四"]}
3   {"time": 1672531199002, "sex": "male", "searchValue": [{"province": "上海", "city": "上海"}, "王五"]}
4   {"time": 1672531199003, "sex": "female", "searchValue": [{"province": "江苏", "city": "南京"}, "赵六"]}
5   {"time": 1672531199004, "sex": "male", "searchValue": [{"province": "浙江", "city": "杭州"}, "孙七"]}

第一步:提取数据

  1. 提取时间
SELECT FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot, '$.time') AS BIGINT)/1000)) AS time
FROM yizu;

结果:

+---------------------+
|        time         |
+---------------------+
| 2023-01-01 00:59:59 |
| 2023-01-01 01:00:00 |
| 2023-01-01 01:00:01 |
| 2023-01-01 01:00:02 |
| 2023-01-01 01:00:03 |
+---------------------+
  1. 提取城市
SELECT get_json_object(cot, '$.searchValue[0].city') AS city
FROM yizu;

结果:

+--------+
|  city  |
+--------+
|  深圳  |
|  北京  |
|  上海  |
|  南京  |
|  杭州  |
+--------+
  1. 提取人名
SELECT get_json_object(cot, '$.searchValue[1]') AS name
FROM yizu;

结果:

+------+
| name |
+------+
| 张三 |
| 李四 |
| 王五 |
| 赵六 |
| 孙七 |
+------+
  1. 整合查询
SELECT 
  FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot, '$.time') AS BIGINT)/1000)) AS time,
  get_json_object(cot, '$.searchValue[0].city') AS city,
  get_json_object(cot, '$.searchValue[1]') AS name
FROM yizu;

结果:

+---------------------+--------+------+
|        time         |  city  | name |
+---------------------+--------+------+
| 2023-01-01 00:59:59 |  深圳  | 张三 |
| 2023-01-01 01:00:00 |  北京  | 李四 |
| 2023-01-01 01:00:01 |  上海  | 王五 |
| 2023-01-01 01:00:02 |  南京  | 赵六 |
| 2023-01-01 01:00:03 |  杭州  | 孙七 |
+---------------------+--------+------+

第二步:数据处理

  1. 使用concat_ws将数据合并为字符串
SELECT 
  concat_ws(',', 
    FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot, '$.time') AS BIGINT)/1000)),
    get_json_object(cot, '$.searchValue[0].city'),
    get_json_object(cot, '$.searchValue[1]')
  ) AS new_c
FROM yizu;

结果:

+-----------------------+
|         new_c         |
+-----------------------+
| 2023-01-01 00:59:59,深圳,张三 |
| 2023-01-01 01:00:00,北京,李四 |
| 2023-01-01 01:00:01,上海,王五 |
| 2023-01-01 01:00:02,南京,赵六 |
| 2023-01-01 01:00:03,杭州,孙七 |
+-----------------------+
  1. 使用split将字符串切割为数组
SELECT 
  split(
    concat_ws(',',
      FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot, '$.time') AS BIGINT)/1000)),
      get_json_object(cot, '$.searchValue[0].city'),
      get_json_object(cot, '$.searchValue[1]')
    ), ','
  ) AS new_c
FROM yizu;

结果:

+------------------------------------------------+
|                    new_c                       |
+------------------------------------------------+
| ["2023-01-01 00:59:59", "深圳", "张三"]         |
| ["2023-01-01 01:00:00", "北京", "李四"]         |
| ["2023-01-01 01:00:01", "上海", "王五"]         |
| ["2023-01-01 01:00:02", "南京", "赵六"]         |
| ["2023-01-01 01:00:03", "杭州", "孙七"]         |
+------------------------------------------------+
  1. 使用explode将数组转换为多行显示
SELECT id, c1
FROM (
  SELECT 
    id,
    split(
      concat_ws(',',
        FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot, '$.time') AS BIGINT)/1000)),
        get_json_object(cot, '$.searchValue[0].city'),
        get_json_object(cot, '$.searchValue[1]')
      ), ','
    ) AS new_c
  FROM yizu
) a
LATERAL VIEW EXPLODE(new_c) lv AS c1;

结果:

+----+-------------------+
| id |        c1         |
+----+-------------------+
|  1 | 2023-01-01 00:59:59|
|  1 | 深圳              |
|  1 | 张三              |
|  2 | 2023-01-01 01:00:00|
|  2 | 北京              |
|  2 | 李四              |
|  3 | 2023-01-01 01:00:01|
|  3 | 上海              |
|  3 | 王五              |
|  4 | 2023-01-01 01:00:02|
|  4 | 南京              |
|  4 | 赵六              |
|  5 | 2023-01-01 01:00:03|
|  5 | 杭州              |
|  5 | 孙七              |
+----+-------------------+
Hadoop Hive数仓实战项目是基于HadoopHive技术的数据仓库项目。在这个项目中,使用Hadoop集群来存储和处理大规模的数据,并使用Hive作为数据仓库的查询和分析工具。 在项目中,首先需要添加一个hadoop用户组,并创建一个hadoop用户,并设置用户密码。然后,切换到hadoop用户,并启动Hive。通过Hive,可以执行一系列的命令,如展示数据库、退出等操作。 引用中提到,Hive建立在Hadoop之上,具有与Hadoop相同的可扩展性,可以轻松应对大规模的数据处理需求。这意味着Hadoop Hive数仓实战项目可以处理大规模的数据,并能够支持超过1000个节点的Hadoop集群。 另外,引用中提到了一些配置文件的重要性,如hive-site.xml和hive-default.xml,它们可以通过设置-hiveconf参数来进行配置。 综上所述,Hadoop Hive数仓实战项目是一个基于HadoopHive技术的大规模数据仓库项目,可以通过Hive进行数据查询和分析,并具有与Hadoop相同的可扩展性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之3.数据仓库工具Hive基础](https://blog.csdn.net/CUFEECR/article/details/121189073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值