ToB企服应用市场:ToB评测及商务社交产业平台

标题: 大数据-229 离线数仓 - ODS层的构建 Hive处理 JSON 数据处理 结构化 [打印本页]

作者: 络腮胡菲菲    时间: 2024-11-26 06:54
标题: 大数据-229 离线数仓 - ODS层的构建 Hive处理 JSON 数据处理 结构化
点一下关注吧!!!非常感谢!!连续更新!!!

Java篇开始了!

现在开始更新 MyBatis,一起深入浅出!
现在已经更新到了:


章节内容

上节我们完成了如下的内容:


整体结构


ODS层

ODS的界说

ODS是一种面向操纵层的数据存储,专注于支持企业的日常运营。它通常整合了来自不同数据源(如ERP、CRM、销售系统等)的数据,通过洗濯、转换后存储,以便快速查询和使用。ODS不以历史数据分析为主要目的,而是以操纵和事务处理为核心。
ODS的特性

实时性或近实时性

ODS中的数据通常是实时或近实时的,能够快速反映业务系统中的最新状态,支持企业的实时决策。
数据整合

ODS整合来自多个源系统的数据,提供统一视图。它会通过ETL(提取、转换、加载)工具对数据进行处理。
非历史性

ODS数据的生命周期相对较短,通常只保存当前或近来的数据,不会恒久存储历史数据。
面向操纵

ODS的计划重点在于支持操纵和事务处理,例如快速查询当前的客户订单状态,而不是复杂的分析或建模。
ODS的架构

ODS通常包含以下主要部门:
数据输入层数据输入层

从事务系统中提取原始数据(大概来自不同的数据源)。
使用ETL工具对数据进行初步洗濯和转换。
数据存储层

存储经过整合的数据,通常以面向主题的情势组织。
数据存储可以是关系型数据库(如MySQL、PostgreSQL)或其他支持快速查询的数据库。
数据访问层

为操纵型应用提供快速查询接口。
大概支持API、SQL查询或直接集成到企业应用中。
创建ODS层

我们启动Hive,进行建立:
ODS层的数据与源数据的格式根本雷同,创建ODS层表:
  1. use ods;
  2. create external table ods.ods_start_log(
  3.   `str` string
  4. ) comment '用户启动日志信息'
  5. partitioned by (`dt` string)
  6. location '/user/data/logs/start';
复制代码
实行结果如下图所示:

加载数据(测试用,可以不做测试)
  1. -- 加载数据(测试时使用)
  2. -- 加分区
  3. alter table ods.ods_start_log add partition(dt='2020-08-02');
  4. -- 删除分区
  5. alter table ods.ods_start_log drop partition(dt='2020-08-02');
复制代码
实行结果如下图所示:

这里可以看到使用的是:external 外部表的模式
加载ODS层数据

  1. mkdir /opt/wzk/hive
  2. vim /opt/wzk/hive
  3. /ods_load_startlog.sh
复制代码
传参数确定日志,没有参数则取昨天日期
  1. #!/bin/bash
  2. APP=ODS
  3. source /etc/profile
  4. # 可以输入日期;如果未输入日期取昨天的时间
  5. if [ -n "$1" ]
  6. then
  7. do_date=$1
  8. else
  9. do_date=`date -d "-1 day" +%F`
  10. fi
  11. # 定义要执行的SQL
  12. sql="
  13. alter table "$APP".ods_start_log add partition(dt='$do_date');
  14. "
  15. hive
  16. -e "$sql"
复制代码
写入的内容如下图所示:

JSON数据处理

数据文件中每行必须要是一个完备的JSON字符串,一个JSON串不能穿越多行,Hive处理JSON数据总体来说有三个办法:

内建函数

get_json_object(string json_string, string path)

返回值:String
说明:剖析JSON字符串json_string,返回path指定的内容,假如输入的JSON字符串无效,那么返回NULL,函数每次只返回一个数据项。
json_tuple(jsonStr, k1, k2…)

返回值:全部的输入参数,输出参数都是String
说明:参数为一组 k1,k2等等和JSON的字符串,返回值的元组,该方法比get_json_object高效,因此可以在一次调用中输入多个键
explode

使用explode将Hive一行中复杂的array或map结构拆分成多行。
测试数据

我们写入数据:
  1. vim /opt/wzk/weibo.json
复制代码
写入内容如下所示:
  1. user1;18;male;{"id": 1,"ids": [101,102,103],"total_number": 3}
  2. user2;20;female;{"id": 2,"ids":[201,202,203,204],"total_number": 4}
  3. user3;23;male;{"id": 3,"ids":[301,302,303,304,305],"total_number": 5}
  4. user4;17;male;{"id": 4,"ids": [401,402,403,304],"total_number":5}
  5. user5;35;female;{"id": 5,"ids": [501,502,503],"total_number":3}
复制代码
写入的结果如下图所示:

建表加载数据

启动Hive
  1. hive
复制代码
随后我们实行:
  1. CREATE TABLE IF NOT EXISTS jsont1(
  2.   username string,
  3.   age int,
  4.   sex string,
  5.   json string
  6. )
  7. row format delimited fields terminated by ';';
  8. load data local inpath '/opt/wzk/weibo.json' overwrite into table jsont1;
复制代码
导入数据的结果如下图所示:

JSON数据的处理

  1. -- get 单层值
  2. SELECT
  3.   username, age, sex,
  4.   get_json_object(json, "$.id") id,
  5.   get_json_object(json, "$.ids") ids,
  6.   get_json_object(json, "$.total_number") num
  7. FROM jsont1;
复制代码
对应的查询结果如下图所示:

  1. -- get 数组
  2. SELECT
  3.   username, age, sex,
  4.   get_json_object(json, "$.id") id,
  5.   get_json_object(json, "$.ids[0]") ids0,
  6.   get_json_object(json, "$.ids[1]") ids1,
  7.   get_json_object(json, "$.ids[2]") ids2,
  8.   get_json_object(json, "$.ids[3]") ids3,
  9.   get_json_object(json, "$.total_number") num
  10. FROM jsont1;
复制代码
实行的结果如下图所示:

  1. -- 使用 json_tuple 一次处理多个字段
  2. SELECT
  3.   json_tuple(json, 'id', 'ids', 'total_number')
  4. FROM jsont1;
复制代码
实行的结果如下图所示:

  1. -- 使用 explode + lateral view
  2. -- 在上一步的基础上,再将数据展开
  3. -- 第一步,将 [101,102,103] 中的 [ ] 替换掉
  4. -- select "[101,102,103]"
  5. -- select "101,102,103"
  6. SELECT regexp_replace("[101,102,103]", "\\[|\\]", "");
  7. -- 第二步,将上一步的字符串变为数组
  8. SELECT split(regexp_replace("[101,102,103]", "\\[|\\]", ""), ",");
  9. -- 第三步,使用explode + lateral view 将数据展开
  10. SELECT username, age, sex, id, ids, num
  11. FROM jsont1
  12. lateral view json_tuple(json, 'id', 'ids', 'total_number') t1
  13. AS id, ids, num;
  14. with tmp AS (
  15. SELECT username, age, sex, id, ids, num
  16. FROM jsont1
  17. lateral view json_tuple(json, 'id', 'ids', 'total_number') t1 AS id, ids, num)
  18. SELECT username, age, sex, id, ids1, num
  19. FROM tmp
  20. lateral view explode(split(regexp_replace(ids, "\\[|\\]", ""), ",")) t1 AS ids1;
复制代码
最终的实行结果如下图所示:

json_tuple 优点是一次可以剖析多个JSON字段,对嵌套结果的剖析操纵复杂。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4