Hive建表中对JSON格式的日志文件处理

【背景说明】

我正在搭建离线数仓,目前已经hive建表阶段,业务数据和(用于测试的)用户历史数据已采集到hdfs上。因用户行为日志都已JSON格式存储,因此需要在hive建表时指定相应格式

页面日志格式:

{"common": {                       -- 环境信息"ar": "15",                   -- 省份ID"ba": "iPhone",              -- 手机品牌"ch": "Appstore",           -- 渠道"is_new": "1",              -- 是否首日使用,首次使用的当日,该字段值为1,过了24:00,该字段置为0。"md": "iPhone 8",            -- 手机型号"mid": "YXfhjAYH6As2z9Iq",  -- 设备id"os": "iOS 13.2.9",          -- 操作系统"sid": "3981c171-558a-437c-be10-da6d2553c517",     -- 会话id"uid": "485",                 -- 会员id"vc": "v2.1.134"             -- app版本号},"actions": [{                     -- 动作(事件)"action_id": "favor_add",   -- 动作id"item": "3",                  -- 目标id"item_type": "sku_id",      -- 目标类型"ts": 1585744376605          -- 动作时间戳}],"displays": [{                    -- 曝光"displayType": "query", -- 曝光类型"item": "3",              -- 曝光对象id"item_type": "sku_id",  -- 曝光对象类型"order": 1,               -- 出现顺序"pos_id": 2,               -- 曝光位置"pos_seq": 1              -- 曝光序列号(同一坑位多个对象的编号)},{"displayType": "promotion","item": "6","item_type": "sku_id","order": 2,"pos_id": 1,"pos_seq": 1},{"displayType": "promotion","item": "9","item_type": "sku_id","order": 3,"pos_id": 3,"pos_seq": 1},{"displayType": "recommend","item": "6","item_type": "sku_id","order": 4,"pos_id": 2,"pos_seq": 1},{"displayType": "query ","item": "6","item_type": "sku_id","order": 5,"pos_id": 1,"pos_seq": 1}],"page": {                          -- 页面信息"during_time": 7648,         -- 持续时间毫秒"item": "3", 	                 -- 目标id"item_type": "sku_id",       -- 目标类型"last_page_id": "login",       -- 上页ID"page_id": "good_detail",      -- 页面ID"from_pos_id":999,              -- 来源坑位ID"from_pos_seq":999,             -- 来源坑位序列号"refer_id":"2",			        -- 外部营销渠道ID"sourceType": "promotion"      -- 来源类型},                                 "err": {                              --错误"error_code": "1234",          --错误码"msg": "***********"           --错误信息},                                 "ts": 1585744374423                --跳入时间戳
}

启动日志格式:

{"common": {"ar": "370000","ba": "Honor","ch": "wandoujia","is_new": "1","md": "Honor 20s","mid": "eQF5boERMJFOujcp","os": "Android 11.0","sid":"a1068e7a-e25b-45dc-9b9a-5a55ae83fc81","uid": "76","vc": "v2.1.134"},"start": {   "entry": "icon",         --icon手机图标  notice 通知   install 安装后启动"loading_time": 18803,    --启动加载时间"open_ad_id": 7,           --广告页ID"open_ad_ms": 3449,        -- 广告总共播放时间"open_ad_skip_ms": 1989   --  用户跳过广告时点},"err":{                         --错误"error_code": "1234",      --错误码"msg": "***********"       --错误信息
},"ts": 1585744304000
}

需要建立用一张表映射上述两种格式的行为日志:

Hive建表格式:

DROP TABLE IF EXISTS ods_log_inc;
CREATE EXTERNAL TABLE ods_log_inc -- 学习阶段用外部表,工作阶段因为没人用你的表,用内部表就行
(`common` STRUCT<ar :STRING,ba :STRING,ch :STRING,is_new :STRING,md :STRING,mid :STRING,os :STRING,sid :STRING,uid :STRING,vc :STRING> COMMENT '公共信息',`page` STRUCT<during_time :STRING,item :STRING,item_type :STRING,last_page_id :STRING,page_id :STRING,from_pos_id :STRING,from_pos_seq :STRING,refer_id :STRING> COMMENT '页面信息',`actions` ARRAY<STRUCT<action_id:STRING,item:STRING,item_type:STRING,ts:BIGINT>> COMMENT '动作信息',`displays` ARRAY<STRUCT<display_type :STRING,item :STRING,item_type :STRING,`pos_seq` :STRING,pos_id :STRING>> COMMENT '曝光信息',`start` STRUCT<entry :STRING,first_open :BIGINT,loading_time :BIGINT,open_ad_id :BIGINT,open_ad_ms :BIGINT,open_ad_skip_ms :BIGINT> COMMENT '启动信息',`err` STRUCT<error_code:BIGINT,msg:STRING> COMMENT '错误信息',`ts` BIGINT  COMMENT '时间戳'
) COMMENT '活动信息表'PARTITIONED BY (`dt` STRING)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'LOCATION '/warehouse/gmall/ods/ods_log_inc/'TBLPROPERTIES ('compression.codec'='org.apache.hadoop.io.compress.GzipCodec');

说明:

1.建表多出来的字段(属性)如果源文件没有这个字段(属性),是不报错的,只是不被解析而已,表中对应的那个字段就为空。比如页面日志就没有start属性,那么表中对应的那一列就是空值,但启动日志这列就有值。

2.如果属性值对应的{},且字段行数是固定的,那么用struct存储,具体参见上述common,page,err属性建表

3.如果属性值对应[],里面又是{}且字段固定,外层用array存储,里面用struct,参见displays或actions属性字段建表

4.属性值对应的时间戳,用BIGINT存储,参加ts属性建表方式

5.单一字段,用string存储,如item_type :STRING

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android永不息屏和关闭锁屏

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

kali——勒索病毒metasploit

我先来叙述一下大致流程&#xff1a; 1、使用mfs对 445端口进行攻击获得一系列权限 2、更新mfs版本 3、使用search 17_010对命令进行查看 4、use auxiliary/scanner/smb/smb_ms17_010使用该模块设置靶机set rhosts 靶机ip和设置本机监听端口 set lhost 0-65535 5、options…

数智亚运,为什么需要智能电子桌牌?

近日&#xff0c;杭州亚运会博物馆正式对公众开放&#xff0c;深度还原了杭州从申请办、筹办至举办亚运会的各个精彩历程。馆内有“亚运与杭州”、“亚运与亚洲”“亚运与未来”三大板块展示区&#xff0c;展示了大量亚运会使用过的实物&#xff0c;还有当时引人注目的数字科技…

53、图论-课程表

思路&#xff1a; 其实就是图的拓扑排序&#xff0c;我们可以构建一个图形结构&#xff0c;比如[0,1]表示1->0&#xff0c;对于0来说入度为1。 遍历结束后&#xff0c;从入度为0的开始遍历。引文只有入度为0的节点没有先决条件。然后依次减少1。直到所有节点入度都为0.然后…

开发同城O2O跑腿系统源码:构建高效便捷的本地服务平台教程

为了满足用户对便捷的需求&#xff0c;今天我们将一同探讨如何开发一个高效便捷的同城O2O跑腿系统&#xff0c;以构建一个功能全面、操作简单的本地服务平台。 一、确定需求和功能 在开发同城O2O跑腿系统之前&#xff0c;首先需要明确系统的需求和功能。用户可以通过该系统发布…

flutter笔记-hello dart

文章目录 1. 搭建环境2. 运行官方首个程序3. AS中运行iOSAndroid 语法简述1. 变量常量字符串补充 2. 集合3. 函数关于可选报错&#xff1a;匿名函数 4. 特殊运算符5. 类 dart 包 1. 搭建环境 环境的搭建在window和mac都差不多&#xff0c;都是从官网下载对应操作系统对应版本的…

某零售企业招聘管理体系搭建咨询项目

科学岗位分析&#xff0c;改善招聘流程&#xff0c;提高招聘及时率随着公司不断发展壮大&#xff0c;企业规模逐渐增大&#xff0c;部门设置也日益增多&#xff0c;因此对人员的需求也日益提高。但是目前该企业在人员招聘方面逐渐暴露出一些诸如岗位分析不到位、缺乏整体面试计…

开源博客项目Blog .NET Core源码学习(17:App.Hosting项目结构分析-5)

本文学习并分析App.Hosting项目中前台页面的作品展示页面和首页页面。 作品展示页面 作品展示页面总体上为上下布局&#xff0c;上方显示导航菜单&#xff0c;下方从左向右显示图片数据&#xff0c;支持放大查看图片和下载图片。整个页面使用了layui中的面包屑导航、弹出层、流…

强化学习2:Q-learning 算法

如果对强化学习没有了解&#xff0c;推荐先学习一下&#xff1a;强化学习基本原理 1 Q-Learning&#xff1a;简介 Q-Learning 是一种基于价值迭代的强化学习算法&#xff0c;用于解决马尔可夫决策过程&#xff08;MDP&#xff09;中的问题。在 Q-Learning 中&#xff0c;代理…

【后端】python2和python3的语法差异

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、为何要了解不同版本的语法差异二、python2和python3的语法差异三、总结 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使…

SAP DMS创建文档根目录操作简介

前面我们已经对DMS的后台进行了系统的配置,本文开始我们对DMS的前台操作进行说明 1、CV01N创建文档 注意:EDIPUBLICROOTFOLDER为根目录的凭证号,不允许更改。 输入好后回车。进入下图所示: 点击文档浏览器,进入下一屏如下图: 注意:点击创建新的私人文件夹按创建是创…

关于pdf.js中文本坐标尺寸的使用

一个电子教材项目中有这样一个需求&#xff1a; 用户向网站上传一个PDF书籍后&#xff0c;网站可以对PDF书籍进行解析&#xff0c;并支持用户对PDF书籍的每一页做一些操作&#xff0c;比如&#xff1a;为英语课本的单词和句子添加音频热区。因为热区数量很多&#xff0c;所以&a…

埋点,自己写插件,自己写的按钮埋点,掘金同款投递简历

20分钟掌握 Vite 插件开发 - 掘金 vite的生命周期啥的 1.浏览器的控制台输出有样式的字 // const randomLetterPlugin ()>{ // const letters [wwwwwww,000000000000,888888888888]; // //随机获取一个字符并打印 // const printRandomLetter ()>{ // …

PHP校验15位和18位身份证号

第十八位数字的计算方法为&#xff1a; 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分 别为&#xff1a;7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2.将这17位数字和系数相乘的结果相加。 3.用加出来和除以11&#xff0c;看余数是多少&#xff1f; 4…

一篇文章学会 MySQL UNION

组合查询 UNION UNION 运算符用于合并两个或多个 SELECT 语句的结果集&#xff0c;去除重复行。它在 SQL 中非常有用&#xff0c;可以用于多种场景&#xff0c;例如&#xff1a; 1. 从不同的表中获取相似数据: 假设有两个表&#xff0c;customers 和 leads&#xff0c;都包含…

智能小车-轮趣wheeltec(原版代码)

上一届大佬的 红绿灯识别代码&#xff0c;此代码需要在ubuntu系统下&#xff0c;与ROS配合使用&#xff1a; Xtrak 塔克小车巡线代码以及红绿灯识别相关小改动_search_top0 mask-CSDN博客 line.follow原版 源代码&#xff1a; #------------------------------------------…

现代C++新特性——constexpr

在计算机科学中&#xff0c;字面量&#xff08;literal&#xff09;是在源代码中的 value 的文本表示。字面量和变量、常量是同一个级别的概念&#xff0c;常被用于初始化变量。字面量是编译期常量&#xff0c;效率极高。 常量表达式&#xff08;const expression&#xff09;是…

【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍 ​ 每当我们要对一条记录做改动时&#xff08;这里的改动可以指 INSERT 、 DELETE 、 UPDATE &#xff09;&#xff0c;都需要留一手 -> 把回滚时所需的东西都给记下来 ​ 你插入一条记录时&#xff0c;至少要把这条记录的主键值记下来&#xff0c;之后回滚的…

【后端】django查询时的性能优化技巧

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、为什么需要性能优化二、性能优化的常用技巧三、总结 前言 随着开发语言的不断普及&#xff0c;越来越多的项目建设场景会遇到性能瓶颈&#xff0c;本文就介…

自定义数据 微调CLIP (结合paper)

CLIP 是 Contrastive Language-Image Pre-training 的缩写&#xff0c;是一个擅长理解文本和图像之间关系的模型&#xff0c;下面是一个简单的介绍&#xff1a; 优点&#xff1a; CLIP 在零样本学习方面特别强大&#xff0c;它可以&#xff08;用自然语言&#xff09;给出图像…