sehll脚本生成数据加载到Hive表中

tech2024-07-19  64

shell脚本生成数据加载到Hive表中

一、hive中建表二、编写shell 脚本三、上传文件至hdfs

一、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_skdatemonthmonth_namequarteryear日期编号日期月份月份名称季度年份

二、编写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;

部分截图如下:

最新回复(0)