(从电商项目认识数仓体系四)行为数仓加载数据

本文介绍了在电商项目中构建数仓体系的过程,重点讲解了ODS和DWD层的数据加载步骤。ODS层通过shell脚本自动加载JSON数据,DWD层则涉及到UDF和UDTF函数解析,用于提取和转换数据,并使用parquet格式存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 ODS数据加载

  1. 判断表是否存在,如果存在,需要先将表删除:DROP TABLE IF EXISTS ods_start_log;
  2. 创建一张外部表,一个json串,就作为一条记录,所以该表只有一个字段:CREATE EXTERNAL TABLE ods_start_log(line STRING);
  3. 按日期进行分区:PARTITIONED BY (`dt` STRING)
  4. LZO压缩格式处理:STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
  5. 设置数据存储位置:LOCATION '/warehouse/gmall/ods/ods_start_log';
  6. 将数据加载到表中:LOAD DATA INPATH '要加载的数据的路径' INTO TABLE ods_start_log PARTITION (dt='日期'`)
  7. 因为每天都要加载数据,所以需要使用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数据加载

  1. 判断表是否存在,如果存在,需要先将表删除:DROP TABLE IF EXISTS dwd_base_start_log;
  2. 创建一张外部表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);
  3. 按日期进行分区:PARTITIONED BY (`dt` STRING)
  4. 设置存储格式和数据存储位置:STORED AS parquet LOCATION '/warehouse/gmall/dwd/dwd_base_Start_log/'
  5. 自定义解析公共字段的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")
  6. 将传入的key用“,”切割:String[] jaonkeys = mid uid vc vn l sr os ar md ba sv g hw nw ln la t
  7. 将传入的line,用“|”切割,取出服务器时间serverTime和json数据
  8. 根据切割后获取的json数据,创建一个JSONObject对象
  9. 根据创建的JSONObject对象,传入key值,获取公共字段的value,将所有value值通过\t拼接在一起
  10. 自定义解析具体事件的UDTF函数
  11. 将UDF于UDTF方法使用maven进行打包后放置集群
  12. 将jar包添加到hive的classpath:add jar jar包路径
  13. 创建函数:CREATE FUNCTION base_analizer AS 'udf.BaseFieldUDF';CREATE FUNCTION flat_analizer AS 'udtf.EventJsonUDTF'
  14. 使用UDTF函数:LATERAL VIEW FLAT_ANALIZER(ops) tmp_k AS event_name,event_json
  15. 形成shell脚本,由ods层解析基本数据
  16. 由dwd基本数据解析表,生成对应事件表

实现语句:

a.hql脚本

DROP TABLE IF EXISTS dwd_base_start_log;
CREATE EXTERNAL TABLE 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值