栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

【数据仓库】【第八章】ODS层建模

【数据仓库】【第八章】ODS层建模

1.创建数据库

现在数仓环境已经搭建好了;
数据也都已经采集到hdfs上了;

1)启动hive

[atguigu@hadoop102 hive]$ bin/hive

2)显示数据库

hive (default)> show databases;

3)创建数据库

hive (default)> create database gmall;

4)使用数据库

hive (default)> use gmall;
ODS层 1.用户行为数据 (1)建表分析
  • 一行数据是什么:一条日志
  • 有哪些字段:只有一个字段
  • 如何分区:按天分区,每天存放一天的用户日志
  • ods层数据存储
(2)建表语句
drop table if exists ods_log;
CREATE EXTERNAL TABLE ods_log (`line` string)
PARTITIonED BY (`dt` string) -- 按照时间创建分区
STORED AS -- 指定存储方式,读数据采用LzoTextInputFormat;
  INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/warehouse/gmall/ods/ods_log'  -- 指定数据在hdfs上的存储位置
;
  • Inputformat:从这张表中读取数据时用的format;取决于这张表中存储的数据的文件格式,是lzo压缩的格式。
    需要注意: 在使用hive读取表的时候,如果不走MR任务,会按照此表指定的InputFormat格式来读取,如果走MR任务,会按照Hive自身默认的读取格式来读取;

  • Outputformat:往这张表写数据时用的,只对insert方式起作用;
    Ods层的表都是从hdfs直接load过来的,因此这里outputformat的设置没有什么意义;

说明Hive的LZO压缩:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LZO

(3)加载数据

load data inpath '/origin_data/gmall/log/topic_log/2020-06-14' 
into table ods_log partition(dt='2020-06-14');

注意:时间格式都配置成YYYY-MM-DD格式,这是Hive默认支持的时间格式

(4)为lzo压缩文件创建索引
[atguigu@hadoop102 bin]$ hadoop jar 
/opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /warehouse/gmall/ods/ods_log/dt=2020-06-14
(5)脚本

1)编写脚本

(1)在hadoop102的/home/atguigu/bin目录下创建脚本

[atguigu@hadoop102 bin]$ vim hdfs_to_ods_log.sh

在脚本中编写如下内容

#!/bin/bash

# 定义变量方便修改
APP=gmall

# 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天
if [ -n "$1" ] ;then
   do_date=$1
else 
   do_date=`date -d "-1 day" +%F`
fi 

echo ================== 日志日期为 $do_date ==================
sql="
load data inpath '/origin_data/$APP/log/topic_log/$do_date' into table ${APP}.ods_log partition(dt='$do_date');
"

hive -e "$sql"

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /warehouse/$APP/ods/ods_log/dt=$do_date

(1)说明1:
[ -n 变量值 ] 判断变量的值,是否为空
– 变量的值,非空,返回true
– 变量的值,为空,返回false
注意:[ -n 变量值 ]不会解析数据,使用[ -n 变量值 ]时,需要对变量加上双引号(" ")

(2)说明2:
查看date命令的使用,date --help

(2)增加脚本执行权限
[atguigu@hadoop102 bin]$ chmod 777 hdfs_to_ods_log.sh

2)脚本使用
(1)执行脚本
[atguigu@hadoop102 module]$ hdfs_to_ods_log.sh 2020-06-14
(2)查看导入数据

2.业务数据 (1)分区规划

ODS层业务表分区规划如下:

  • 第一天是全量的
  • 从第二天开始不同表的同步策略不同
(2)数据装载

(3)建表语句
DROP TABLE IF EXISTS ods_activity_info;
CREATE EXTERNAL TABLE ods_activity_info(
    `id` STRING COMMENT '编号',
    `activity_name` STRING  COMMENT '活动名称',
    `activity_type` STRING  COMMENT '活动类型',
    `start_time` STRING  COMMENT '开始时间',
    `end_time` STRING  COMMENT '结束时间',
    `create_time` STRING  COMMENT '创建时间'
) COMMENT '活动信息表'
PARTITIonED BY (`dt` STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
STORED AS
  INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/warehouse/gmall/ods/ods_activity_info/';

(4)数据装载脚本 3.ODS层总结
  • ods层只做原始数据的备份;
  • 在将日志数据转移到ods层时需要建立lzo索引,而业务数据没有建立索引;因为sqoop脚本中在导入数据的时候就建立索引了;在通过load方法将hdfs上目录下的数据导入到ods层,其实就是将目录下的所有文件都copy到ods层的表目录下,所以业务数据不需要再建立索引
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/698487.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号