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
INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/warehouse/gmall/ods/ods_log'
;
-
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层的表目录下,所以业务数据不需要再建立索引
|