Hive生成日期维度表

这篇具有很好参考价值的文章主要介绍了Hive生成日期维度表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、时间维表(完整版)

1)、 建表
-- 时间维表 完整版
create table if not exists dim.dim_date (
 date_id                   string         comment '日期(yyyymmdd)'
,datestr                   string         comment '日期(yyyy-mm-dd)'
,date_name                 string         comment '日期名称中文'
,weekid                    int            comment '周(0-6,周日~周六)'
,week_cn_name              string         comment '周_名称_中文'
,week_en_name              string         comment '周_名称_英文'
,week_en_nm                string         comment '周_名称_英文缩写'
,yearmonthid               string         comment '月份id(yyyymm)'
,yearmonthstr              string         comment '月份(yyyy-mm)'
,monthid                   int            comment '月份id(1-12)'
,monthstr                  string         comment '月份'
,month_cn_name             string         comment '月份名称_中文'
,month_en_name             string         comment '月份名称_英文'
,month_en_nm               string         comment '月份名称_简写_英文'
,quarterid                 int            comment '季度id(1-4)'
,quarterstr                string         comment '季度名称'
,quarter_cn_name           string         comment '季度名称_中文'
,quarter_en_name           string         comment '季度名称_英文'
,quarter_cn_nm             string         comment '季度名称_简写中文'
,quarter_en_nm             string         comment '季度名称_简写英文'
,yearid                    int            comment '年份id'
,year_cn_name              string         comment '年份名称_中文'
,year_en_name              string         comment '年份名称_英文'
,month_start_date          string         comment '当月1号(yyyy-mm-dd)'
,month_end_date            string         comment '当月最后日期(yyyy-mm-dd)'
,month_timespan            int            comment '月跨天数'
,week_of_year              int            comment '当年第几周'
,workday_flag              string         comment '是否工作日(周一至周五Y,否则:N)'
,weekend_flag              string         comment '是否周末(周六和周日Y,否则:N)'
)comment '日期维度表'
stored as orc;
2)、插入数据
insert overwrite table dim.dim_date

select  date_id
    ,datestr
    ,concat(yearid,'年',monthid,'月',substr(datestr,9,2),'日') as date_name
    ,weekid
    ,case weekid when 0 then '星期日'
        when 1 then '星期一'
        when 2 then '星期二'
        when 3 then '星期三'
        when 4 then '星期四'
        when 5 then '星期五'
        when 6 then '星期六'
    end as week_cn_name
    ,case weekid when 0 then 'Sunday'
        when 1 then 'Monday'
        when 2 then 'Tuesday'
        when 3 then 'Wednesday'
        when 4 then 'Thurday'
        when 5 then 'Friday'
        when 6 then 'Saturday'
    end as week_en_name
    ,case weekid when 0 then 'Sun'
        when 1 then 'Mon'
        when 2 then 'Tues'
        when 3 then 'Wed'
        when 4 then 'Thur'
        when 5 then 'Fri'
        when 6 then 'Sat'
    end as week_en_nm
    ,substr(date_id,1,6) as yearmonthid
    ,substr(datestr,1,7) as yearmonthstr
    ,monthid
    ,concat(yearid,'年',monthid,'月') as monthstr
    ,concat(monthid,'月') as month_cn_name
    ,case monthid when 1 then 'January'
        when 2 then 'February'
        when 3 then 'March'
        when 4 then 'April'
        when 5 then 'May'
        when 6 then 'June'
        when 7 then 'July'
        when 8 then 'August'
        when 9 then 'September'
        when 10 then 'October'
        when 11 then 'November'
        when 12 then 'December'
    end as month_en_name
    ,case monthid when 1 then 'Jan'
        when 2 then 'Feb'
        when 3 then 'Mar'
        when 4 then 'Apr'
        when 5 then 'May'
        when 6 then 'Jun'
        when 7 then 'Jul'
        when 8 then 'Aug'
        when 9 then 'Sept'
        when 10 then 'Oct'
        when 11 then 'Nov'
        when 12 then 'Dec'
    end as month_en_nm
    ,quarterid
    ,concat(yearid,quarterid) as quarterstr
    ,concat(yearid,'年第',quarterid,'季度') as quarter_cn_name
    ,concat(yearid,'Q',quarterid) as quarter_en_name
    ,case quarterid when 1 then '第一季度'
        when 2 then '第二季度'
        when 3 then '第三季度'
        when 4 then '第四季度'
    end as quarter_cn_nm
    ,concat('Q',quarterid) as quarter_en_nm
    ,yearid
    ,concat(yearid,'年') as year_cn_name
    ,yearid as year_en_name
    ,month_start_date
    ,month_end_date
    ,datediff(month_end_date,month_start_date) + 1 as month_timespan
    ,week_of_year
    ,case when weekid in (1,2,3,4,5) then 'Y' else 'N' end as workday_flag
    ,case when weekid in (0,6) then 'Y' else 'N' end as weekend_flag
from
(
    select   from_unixtime(unix_timestamp(datestr,'yyyy-MM-dd'),'yyyyMMdd') as date_id
        ,datestr as datestr
        ,pmod(datediff(datestr, '2012-01-01'), 7)  as weekid
        ,concat(substr(datestr,1,4),substr(datestr,6,2)) as yearmonthid
        ,substr(datestr,1,7) as yearmonthstr
        ,cast(substr(datestr,6,2) as int) as monthid
        ,case when cast(substr(datestr,6,2) as int) <= 3 then 1
            when cast(substr(datestr,6,2) as int) <= 6 then 2
            when cast(substr(datestr,6,2) as int) <= 9 then 3
            when cast(substr(datestr,6,2) as int) <= 12 then 4
        end as quarterid
        ,substr(datestr,1,4) as yearid
        ,date_sub(datestr,dayofmonth(datestr)-1) as  month_start_date  --当月第一天
        ,last_day(date_sub(datestr,dayofmonth(datestr)-1)) month_end_date --当月最后一天
        ,weekofyear(datestr) as week_of_year
    from
    (
        select date_add('2000-01-01',t0.pos) as datestr
            from
            (
                select posexplode(
                        split(
                            repeat('o', datediff(from_unixtime(unix_timestamp('20991231','yyyymmdd'),'yyyy-mm-dd'), '2000-01-01')), 'o'
                        )
                    )
            ) t0
    ) t

) A
;

2、解释一下

使用 posexplode() 函数,获得 [2000-01-01, 2099-12-31] 的日期列表:

select date_add('2000-01-01',t0.pos) as datestr
from (
        select posexplode(
                       split(
                               repeat('o', datediff(from_unixtime(unix_timestamp('20991231','yyyymmdd'),'yyyy-mm-dd'), '2000-01-01')), 'o'
                           )
                   )
    ) t0
  • posexplode(ARRAY a),与 explode 类似,行转列函数,返回的 pos 列用来记录序号,序号从 0 开始,即t0.pos[0,datediff]
    官方解释:将数组分解为多行,并带有 int 类型的附加位置列(原始数组中项的位置,从 0 开始)。返回包含两列 (pos,val) 的行集,数组中的每个元素各占一行。
  • repeat用来构建split分割所需的字符串(以’o’分割的字符串),datediff取日差。

3、熄灯

~文章来源地址https://www.toymoban.com/news/detail-678721.html

到了这里,关于Hive生成日期维度表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive常见时间日期函数的使用与问题整理

    这里整理一下Hive常见的时间函数和日期函数和用法,作为平时数据处理过程的一个检索和记录。 平时在数据处理过程中,如果不经常使用时间函数,一时间遇到一些时间上的处理,难免会想不起来。 hive本身提供的时间函数已经很丰富了,基本上能满足我们所有的需求,一些

    2024年02月08日
    浏览(45)
  • SQL使用技巧(4.1)Hive日期时间函数

    常用的格式化(format)标识符: 本章节每一行代码后都有运算说明和执行结果样例,例如 - - 返回当前系统日期 yyyy-MM-dd, 【2023-04-01】 原生hive中不支持 now() 的写法,经过加工的工具(TDWTDH)可能支持,不绝对。 unix_timestamp() 也会返回一个时间戳,但并不是系统当前时间的时间

    2024年02月12日
    浏览(44)
  • spark SQL 怎么将一个时间戳字符串转换成hive支持的时间日期类型?

    在 Spark SQL 中,可以使用 to_timestamp 函数将一个时间戳字符串转换成 Hive 支持的时间日期类型。这个函数的语法如下: 其中,timestampStr 表示要转换的时间戳字符串,format 表示时间戳字符串的格式,格式必须与时间戳字符串的实际格式相匹配。如果不指定格式,Spark 会使用默认

    2024年02月11日
    浏览(46)
  • Hive数据仓库---Hive的安装与配置

    Hive 官网地址:https://hive.apache.org/ 下载地址:http://www.apache.org/dyn/closer.cgi/hive/ 把安装文件apache-hive-3.1.2-bin.tar.gz上传到master节点的/opt/software目 录下,执行以下命令把安装文件解压到/opt/app目录中 进入/opt/app目录,为目录apache-hive-3.1.2-bin建立软件链接 即输入hive就相当于输入a

    2024年02月02日
    浏览(40)
  • java和sql生成时间维度数据

    JAVA: POM依赖:   代码: SQL:

    2024年02月11日
    浏览(41)
  • hive数据仓库工具

    1、hive是一套操作数据仓库的应用工具,通过这个工具可实现mapreduce的功能 2、hive的语言是hql[hive query language] 3、官网hive.apache.org 下载hive软件包地址  Welcome! - The Apache Software Foundation https://archive.apache.org/ 4、hive在管理数据时分为元数据和真数据,其中元数据要保存在数据库中

    2024年02月04日
    浏览(34)
  • Hive数据仓库

    数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。 数据仓库的目的是构建面相分析的集成化数据环境,分析结果为企业提供决策支持(Decision Support)。 数据仓库本身并不“产生”任何数据,其数据来源不同外部系统; 同时数据仓库

    2024年02月15日
    浏览(39)
  • Hive数据仓库简介

    Hive起源于Facebook,Facebook公司有着大量的日志数据,而Hadoop是实现了MapReduce模式开源的分布式并行计算的框架,可轻松处理大规模数据。然而MapReduce程序对熟悉Java语言的工程师来说容易开发,但对于其他语言使用者则难度较大。因此Facebook开发团队想设计一种使用SQL语言对日

    2024年02月15日
    浏览(55)
  • 数据仓库 & Apache Hive

    目录 一、数据分析 1、数据仓库 1.1、数仓专注分析 1.2、数仓主要特征 1.3、数据仓库主流开发语言--SQL 2、Apache Hive 2.1、为什么使用Hive? 2.2、Hive和Hadoop关系 2.3、Hive架构图、各组件功能 2.4、Hive安装部署 2.4.1、Hive概念介绍 2.4.2、安装前准备     数据仓库 (英语:Data Warehous

    2024年01月22日
    浏览(46)
  • hive数据仓库课后答案

    一、 填空题 1.数据仓库的目的是构建面向     分析         的集成化数据环境。 2.Hive是基于     Hadoop         的一个数据仓库工具。 3.数据仓库分为3层,即      源数据层        、     数据应用层        和数据仓库层。 4.数据仓库层可以细分为      明细层

    2023年04月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包