一、hive中建表
- 创建数据库:
create database sales_dw;
use sales_dw;
- 建表:
create table dim_date
(
date_sk int,
date date,
month tinyint,
month_name varchar(16),
quarter tinyint,
year int
) row format delimited fields terminated by ','
stored as textfile;
dim_date
为内部表,字段含义为:
date_sk | date | month | month_name | quarter | year |
---|---|---|---|---|---|
日期编号 | 日期 | 月份 | 月份名称 | 季度 | 年份 |
二、编写shell 脚本
- 创建脚本文件
vi generate_dim_date.sh
内容如下:
#!/bin/bash
# 起始日期,传入的第一个参数为 date1
date1=$1
# 终止日期,传入的第二个参数为 date2
date2=$2
# 日期,返回 date1 的完整日期,不包含时分秒
tmpdate=`date -d "$date1" +%F`
# 起始时间戳 date1
startSec=`date -d "$date1" +%s`
# 终止时间戳 date2
endSec=`date -d "$date2" +%s`
# 循环的起始值
min=1
# 循环的终止值,表示终止时间与起始时间二者相差的天数
# expr表达式中每个字符之间都要有空格,否则会报错, \( 表示转义
max=`expr \( $endSec - $startSec \) / 60 / 60 / 24`
#当 min < max 的时候执行while循环(注意空格):
while [ $min -le $max ]
do
# 计算月份
month=`date -d "$tmpdate" +%m`
# 计算月份名称
month_name=`date -d "$tmpdate" +%B`
# 计算年
year=`date -d "$tmpdate" +%Y`
# 计算季度
quarter=`expr \( $month - 1 \) \/ 3 + 1`
# 输出到文件
echo ${min}","${tmpdate}","${month}","${month_name}","${quarter}","${year} >> ./dim_date.csv
# 计算下一次的日期(+1 day 代表当前日期天数加1)
tmpdate=`date -d "+$min day $date1" +%F`
# 计算下一次的时间戳
startSec=`date -d "+$min day $date1" +%s`
# 变量+1
min=`expr $min + 1`
done
注:测试脚本中语句:
startSec=`date -d "$2020-9-1" +%s`
endSec=`date -d "$2020-9-3" +%s`
max=`expr \( $endSec - $startSec \) / 60 / 60 / 24`
#相减是两者相差的秒数,除以60得到分/得到小时/得到天数
echo $max --> #返回2,即相差2天
date -d '2020-9-1' +%F --> 2020-09-01,返回完整日期,不包含时分秒
time=`date -d '2020-9-1' +%F`
echo $time --> 2020-09-01
- 给脚本文件赋权:
chmod +x generate_dim_date.sh
-
执行脚本(传入起始日期:2010-1-1,终止日期:2050-1-1):
数据量较大,需稍微等待一段时间
./generate_dim_date.sh 2010-1-1 2050-1-1
可以看到生成了
dim_date.csv
文件
三、上传文件至hdfs
-
查看文件上传路径
在hive命令行查看
dim_date
建表语句:
show create table dim_date;
如下图:
由于是内部表,可以找到表数据的存储目录:
/hive/warehouse/sales_dw.db/dim_date
-
将
dim_date.csv
文件上传至此目录下
hdfs dfs -put dim_date.csv /hive/warehouse/sales_dw.db/dim_date
3.上传完成查询到表数据
select * from dim_date;
部分截图如下:
版权声明:本文为and52696686原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。