Hive复杂日志数据类型的存储与解析
一、基础概览
1.问题背景
- 实际工作中会遇到很多复杂数据类型,尤其是离线日志中的嵌套json,本文列举几种常见的复杂格式,同时给出存储和解析方法。
2.复杂类型
ARRAY
:ARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。比如有一个ARRAY类型的变量fruits,它是由[‘apple’,‘orange’,‘mango’]组成,那么我们可以通过fruits[1]来访问元素orange,因为ARRAY类型的下标是从0开始的;MAP
:MAP包含key->value键值对,可以通过key来访问元素。比如”userlist”是一个map类型,其中username是key,password是value;那么我们可以通过userlist[‘username’]来得到这个用户对应的password;STRUCT
:STRUCT可以包含不同数据类型的元素。这些元素可以通过”点语法”的方式来得到所需要的元素,比如user是一个STRUCT类型,那么可以通过user.address得到这个用户的地址。
二、场景一
1.日志格式
给出两条日志数据如下,日志本身是一个json,其中event_values又嵌套了一层json。
{
"user_id":"1",
"event_name":"people",
"event_values":
"{
"search_word":"hui",
"search_res":[192061100,819430495],
"with_result":true
}",
"client_timestamp":1500762196
}
{
"user_id":"2",
"event_name":"company",
"event_values":
"{
"search_word":"doug",
"search_res":[81943049,5192025160,85303900],
"with_result":true
}",
"client_timestamp":1500818667
}
2.Hive存储
日志数据接入数仓,一般先存放在ods层,这种比较简单的json数据可以直接存储String类型,建表语句:
CREATE EXTERNAL TABLE `ods_user_info`(
`user_id` string,
`event_name` string