1 ODS数据加载
- 判断表是否存在,如果存在,需要先将表删除:DROP TABLE IF EXISTS ods_start_log;
- 创建一张外部表,一个json串,就作为一条记录,所以该表只有一个字段:CREATE EXTERNAL TABLE ods_start_log(line STRING);
- 按日期进行分区:PARTITIONED BY (`dt` STRING)
- LZO压缩格式处理:STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
- 设置数据存储位置:LOCATION '/warehouse/gmall/ods/ods_start_log';
- 将数据加载到表中:LOAD DATA INPATH '要加载的数据的路径' INTO TABLE ods_start_log PARTITION (dt='日期'`)
- 因为每天都要加载数据,所以需要使用shell脚本自动加载
实现语句:
a.hql脚本
DROP TABLE IF EXISTS ods_start_log;
CREATE EXTERNAL TABLE ods_start_log(
line STRING
)
PARTITIONED BY (`dt` STRING)
STORED AS
INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/warehouse/gmall/ods/ods_start_log';
LOAD DATA INPATH '要加载的数据的路径' INTO TABLE ods_start_log PARTITION (dt='日期');
b.shell脚本
#!/bin/bash
database=库名
data_dir=数据路径
#判断变量是否为null,null为true,!null为false
if [ -n $1 ];then
date=$1
else
log_date=`date -d "-1 day" + %F`
fi
hive -e "LOAD DATA INPATH '${data_dir}' INTO TABLE "${database}".ods_start_log PARTITION (dt='${log_date}');"
PS:event表方式相同
2 DWD数据加载
- 判断表是否存在,如果存在,需要先将表删除:DROP TABLE IF EXISTS dwd_base_start_log;
- 创建一张外部表CREATE EXTERNAL TABLE ods_start_log(`mid_id` STRING,`user_id` STRING,`version_code` STRING,`version_name` STRING,`lang` STRING,`source` STRING,`os` STRING,`area` STRING,`model` STRING,`brand` STRING,`sdk_version` STRING,`gmail` STRING,`height_width` STRING,`app_time` STRING,`network` STRING,`lng` STRING,`lat` STRING,`event_name` STRING,`event_json` STRING,`server_time` STRING);
- 按日期进行分区:PARTITIONED BY (`dt` STRING)
- 设置存储格式和数据存储位置:STORED AS parquet LOCATION '/warehouse/gmall/dwd/dwd_base_Start_log/'
- 自定义解析公共字段的UDF函数,根据传入的key,获取对应的value值:String x = new BaseFieldUDF().evaluate(line,"mid,uid,vc,vn,l,sr,os,ar,md,ba,sv,g,hw,nw,ln,la,t")
- 将传入的key用“,”切割:String[] jaonkeys = mid uid vc vn l sr os ar md ba sv g hw nw ln la t
- 将传入的line,用“|”切割,取出服务器时间serverTime和json数据
- 根据切割后获取的json数据,创建一个JSONObject对象
- 根据创建的JSONObject对象,传入key值,获取公共字段的value,将所有value值通过\t拼接在一起
- 自定义解析具体事件的UDTF函数
- 将UDF于UDTF方法使用maven进行打包后放置集群
- 将jar包添加到hive的classpath:add jar jar包路径
- 创建函数:CREATE FUNCTION base_analizer AS 'udf.BaseFieldUDF';CREATE FUNCTION flat_analizer AS 'udtf.EventJsonUDTF'
- 使用UDTF函数:LATERAL VIEW FLAT_ANALIZER(ops) tmp_k AS event_name,event_json
- 形成shell脚本,由ods层解析基本数据
- 由dwd基本数据解析表,生成对应事件表
实现语句:
a.hql脚本
DROP TABLE IF EXISTS dwd_base_start_log;
CREATE EXTERNAL TABLE