【大数据离线项目三:将HIve数仓中的dim进行拉宽聚合处理,PostgreSQL的使用,以及怎么将数据导出到PostgreSQL数据库中】

news2024/11/29 0:41:08

前言:
💞💞大家好,我是书生♡,今天主要和大家分享一下将HIve数仓中的dim进行拉宽聚合处理,PostgreSQL的使用,以及怎么将数据导出到PostgreSQL数据库中,希望对大家有所帮助。
💞💞代码是你的画笔,创新是你的画布,用它们绘出属于你的精彩世界,不断挑战,无限可能!

个人主页⭐: 书生♡
gitee主页🙋‍♂:闲客
专栏主页💞:大数据开发
博客领域💥:大数据开发,java编程,前端,算法,Python
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬

目录

  • 1 将dim的数据导入到dwd层
    • 1.1 将 时间维度表进行导入
    • 1.2 交易类型映射表
    • 1.3 商品分类表处理
    • 1.4 商品表处理
    • 1.5 门店商品表
    • 1.6 日清门店商品表处理
    • 1.7 门店表处理
  • 2. postgrep数据库
    • 2.1 什么是postgrep数据库
    • 2.2 PostgreSQL基本操作
    • 2.3 Data grip 链接PostgreSQL
  • 3. 基于DataX完成数据导出

1 将dim的数据导入到dwd层

问题1:dim层数据作用是什么?

dim层的数据,原理上属于ods源数据层,只不过dim上的数据不用进行清洗处理,dim的数据主要受为了在以后得dwd,dwm以及dws层上面进复用。几乎不需要进行很大的改变。

问题2:为什么要将dim的数据进行聚合生成新的表?

因为我们的dim上面的数据,如果在后面被引用,大概率也是会被进行聚合的。那样的话会导致SQL语句极其复杂并且消耗资源。因此在dwd层先进行一个聚合操作,将我们后续需要的表先生成,之后直接使用就可以了。

  大家想一下假设我们的商品表,有商品的id,名称,类别id ;类别表 有 类别id,类别名称 等等。
如果我们要在后面获取得到我们的 商品的id,名称,类别id,类别名称 那么我们就要对着2个表进行聚合连接,再加上原本的SQL语句会变的极其复杂。因此在dwd层先进行一个聚合操作,将我们后续需要的表先生成,之后直接使用就可以了,会让我们的SQL语句变得更加简洁并且资源消耗更少。

问题3:怎么判断 ,dim层的哪些表需要进行操作?新生成的表又是什么样子的?需要哪些字段?

其实,在我们的大数据开发中,需要哪些新的表被生成,以及表中有哪些字段,是依靠我们的业务去判断的,我们的需要需要哪些字段,以及我们的业务是什么样子的。

例如:我们这个项目是基于一个电商的业务,那么一定需要商品表,这些商品属于哪个类别,类别的级别试试怎么样的。
还有就是我们的店铺,在那个商圈的以及其他的一些关系?

虽然我们这些表经过轻微聚合是要导入到dwd中供其使用,但是依然还是要存储在dim层中,因为这些表并不需要进行清理,只需要调用就可以了。

在这里插入图片描述
那么我们应该怎么对这些表进行处理呢?

  • 商品分类表(category): 需要进行分类拉平操作
    在这里插入图片描述

    • 商品表(goods_info): 将分类ID替换为对应一二三级分类ID、编码和名称
      在这里插入图片描述
  • 门店表: 在门店宽表构建时,就添加了门店面积信息和区域名称信息,门店面积信息可以用来计算坪效等,区域名称信息可以用来上卷时显示区域名称。
    其中门店面积信息可以从分店面积明细表中获取。先取实际经营面积,如果取不到(实际经营面积为空或0)再取经营面积。
    其中区域名称信息从店组信息表中取,storegrouptype_no = ‘04’即对应区域的编码和名称。
    其中 storetypecode和managementtypecode 需要转换为整数类型。

  • 门店日清商品表: 需要在门店商品表的基础上筛选出日清数据, 便于后续统计日清数据指标
    表结构与门店商品表一

1.1 将 时间维度表进行导入

  1. 第一步肯定是创建表,因为不需要先进行任何操作所以字段是一样的,唯一的区别在于 这个是在dwd层的。
    创建表的代码如下:跟dim层的建表语句是一样子的
CREATE TABLE dim.dwd_dim_date_f (
    trade_date              STRING COMMENT '日期编码',
    year_code               BIGINT COMMENT '年编码',
    month_code              BIGINT COMMENT '月份编码',
    day_code                BIGINT COMMENT '日编码',
    quanter_code            BIGINT COMMENT '季度编码',
    quanter_name            STRING COMMENT '季度名称',
    week_trade_date         STRING COMMENT '周一时间',
    month_trade_date        STRING COMMENT '月一时间',
    week_end_date           STRING COMMENT '周末时间',
    month_end_date          STRING COMMENT '月末时间',
    last_week_trade_date    STRING COMMENT '上周一时间',
    last_month_trade_date   STRING COMMENT '上月一时间',
    last_week_end_date      STRING COMMENT '上周末时间',
    last_month_end_date     STRING COMMENT '上月末时间',
    year_week_code          BIGINT COMMENT '一年中第几周',
    week_day_code           BIGINT COMMENT '周几code',
    day_year_num            BIGINT COMMENT '一年第几天',
    month_days              BIGINT comment '本月有多少天',
    is_weekend              BIGINT COMMENT '是否周末(周六和周日)',
    days_after1             STRING COMMENT '1天后的日期',
    days_after2             STRING COMMENT '2天后的日期',
    days_after3             STRING COMMENT '3天后的日期',
    days_after4             STRING COMMENT '4天后的日期',
    days_after5             STRING COMMENT '5天后的日期',
    days_after6             STRING COMMENT '6天后的日期',
    days_after7             STRING COMMENT '7天后的日期'
) 
comment '时间维度表'
row format delimited fields terminated by ','
stored as orc
tblproperties ('orc.compress'='SNAPPY');
  1. 创建完表,肯定就是将dim层的数据导入到dwd层中。
    我们直接将dim层的表直接导入就可以了。
-- HIVE基础参数; 仅在当前会话生效
--hive压缩
--开启中间结果压缩
set hive.exec.compress.intermediate=true;
--开启最终结果压缩
set hive.exec.compress.output=true;
--写入时压缩生效
set hive.exec.orc.compression.strategy=COMPRESSION;

-- 时间维度表
insert overwrite table dim.dwd_dim_date_f
select
    trade_date,
    year_code,
    month_code,
    day_code,
    quanter_code,
    quanter_name,
    week_trade_date,
    month_trade_date,
    week_end_date,
    month_end_date,
    last_week_trade_date,
    last_month_trade_date,
    last_week_end_date,
    last_month_end_date,
    year_week_code,
    week_day_code,
    day_year_num,
    month_days,
    is_weekend,
    days_after1,
    days_after2,
    days_after3,
    days_after4,
    days_after5,
    days_after6,
    days_after7
from dim.ods_dim_date_f;

1.2 交易类型映射表

交易类型映射表和时间维度表是一样子的,只要需要创建好表直接导入就可以了。

  1. 创建表
CREATE TABLE IF NOT EXISTS dim.dwd_dim_source_type_map_i(
    company                     STRING COMMENT '公司:1.传智鲜 2.黑马优选',
    original_source_type        BIGINT COMMENT '原交易来源  传智鲜1:线下pos;2:线上订单;3:扫码购;4:美团;5:饿了么;6:百度外卖;7:京东到家;8:有赞;9:传智鲜精品;10:黑马;11:团购',
    original_source_type_name   STRING COMMENT '原交易来源名称',
    source_type                 BIGINT COMMENT '新交易来源:1',
    source_type_name            STRING COMMENT '新交易来源名称',
    is_online                   BIGINT COMMENT '是否线上交易 0否;1是')
comment '交易类型映射表'
partitioned by (dt STRING COMMENT '写入日期')
row format delimited fields terminated by ','
stored as orc
tblproperties ('orc.compress'='SNAPPY');
  1. 导入
insert overwrite table dim.dwd_dim_source_type_map_i partition (dt)
select
    company,
    original_source_type,
    original_source_type_name,
    source_type,
    source_type_name,
    is_online,
    -- date_sub(current_date(),1) as dt,
    '2024-06-21' as dt
from dim.ods_dim_source_type_map_f ;

1.3 商品分类表处理

商品类别表,我们需要将其进行拉宽处理。
我们假设有父类 – 1级子类 – 2级子类
那我们应该怎么进行拉宽?比如下面的是我们的数据。id是编号,pid是我们父类的编号。
在这里插入图片描述

我们是不是应该让这个表自己与自己相连接,条件为 父.编号=子.父编号
我们有三个类别登记,那我们就 想这个表自己关联自己三次,分别取表名为 t1,t2,t3
条件为 t1.id=t2.pid t2.id=t3.pid

在这里插入图片描述

在这里插入图片描述

  1. 建表
    因为我们只要分类级别的编号,编码以及名称就行啦。
CREATE TABLE IF NOT EXISTS dim.dwd_dim_category_statistics_i(
    first_category_id       BIGINT COMMENT '一级分类ID',
    first_category_no       STRING COMMENT '一级分类编码',
    first_category_name     STRING COMMENT '一级分类',
    
    second_category_id      BIGINT COMMENT '二级分类ID',
    second_category_no      STRING COMMENT '二级分类编码',
    second_category_name    STRING COMMENT '二级分类',
    
    third_category_id       BIGINT COMMENT '三级分类ID',
    third_category_no       STRING COMMENT '三级分类编码',
    third_category_name     STRING COMMENT '三级分类',

    `status` BIGINT) 
comment '分类等级表'
partitioned by (dt STRING COMMENT '写入日期')
row format delimited fields terminated by ','
stored as orc
tblproperties ('orc.compress'='SNAPPY');
  1. 导入
-- 开启动态分区方案
-- 开启非严格模式
set hive.exec.dynamic.partition.mode=nonstrict;
-- 开启动态分区支持(默认true)
set hive.exec.dynamic.partition=true;
-- 设置各个节点生成动态分区的最大数量: 默认为100个  (一般在生产环境中, 都需要调整更大)
set hive.exec.max.dynamic.partitions.pernode=10000;
-- 设置最大生成动态分区的数量: 默认为1000 (一般在生产环境中, 都需要调整更大)
set hive.exec.max.dynamic.partitions=100000;
-- hive一次性最大能够创建多少个文件: 默认为10w
set hive.exec.max.created.files=150000;
--hive压缩
--开启中间结果压缩
set hive.exec.compress.intermediate=true;
--开启最终结果压缩
set hive.exec.compress.output=true;
--写入时压缩生效
set hive.exec.orc.compression.strategy=COMPRESSION;


-- 分类表拉宽操作
insert overwrite table dim.dwd_dim_category_statistics_i partition (dt)
select
    t1.id as first_category_id,
    t1.category_no as first_category_no,
    t1.category_name as first_category_name,
    t2.id as second_category_id,
    t2.category_no as second_category_no,
    t2.category_name as second_category_name,
    t3.id as third_category_id,
    t3.category_no as third_category_no,
    t3.category_name as third_category_name,
    0 as status,
    date_sub(current_date(),1) as dt
from dim.ods_dim_category_f t1
    join dim.ods_dim_category_f t2 on t1.id = t2.parent_id
    join dim.ods_dim_category_f t3 on t2.id = t3.parent_id;

在这里插入图片描述

1.4 商品表处理

在这里插入图片描述

首先我们要知道我们的商品表都需要哪些字段,商品id,商品类别id,以及商品类别的名称,
所以我们就需要将商品表和类别表进行关联。

关联的条件就是 商品的编号=类别表.第三类别编号

在这里插入图片描述

  1. 建表
CREATE TABLE IF NOT EXISTS dim.dwd_dim_goods_i(
    goods_id                BIGINT COMMENT '商品ID',
    goods_no                STRING COMMENT '商品编码',
    goods_name              STRING COMMENT '名称',
    first_category_id       BIGINT COMMENT '一级分类ID',  -- 类别表
    first_category_no       STRING COMMENT '一级分类编码',-- 类别表
    first_category_name     STRING COMMENT '一级分类',-- 类别表
    second_category_id      BIGINT COMMENT '二级分类ID',-- 类别表
    second_category_no      STRING COMMENT '二级分类编码',-- 类别表
    second_category_name    STRING COMMENT '二级分类',-- 类别表
    third_category_id       BIGINT COMMENT '三级分类ID',-- 类别表
    third_category_no       STRING COMMENT '三级分类编码',-- 类别表
    third_category_name     STRING COMMENT '三级分类',-- 类别表
    brand_no                STRING COMMENT '品牌编号',
    spec                    STRING COMMENT '商品规格',
    sale_unit               STRING COMMENT '销售单位',
    life_cycle_status       STRING COMMENT '生命周期状态',
    tax_rate_status         BIGINT COMMENT '税率审核状态 (0:未提交审核 1:待财务审核 2:税率已审核 3:未通过)',
    tax_rate                STRING COMMENT '税率code',
    tax_value               DECIMAL(27, 3) COMMENT '税率',
    order_multiple          DECIMAL(27, 2) COMMENT '订货倍数',
    pack_qty                DECIMAL(27, 3) COMMENT '箱装数量',
    split_type              STRING COMMENT '分割属性',
    is_sell_by_piece        BIGINT COMMENT '是否拆零,0:不拆;1:拆',
    is_self_support         BIGINT COMMENT '是否自营 0:非自营;1:自营',
    is_variable_price       BIGINT COMMENT '分店可变价 0:不可;1:可以',
    is_double_measurement   BIGINT COMMENT '是否双计量商品 0:否;1:是',
    is_must_sell            BIGINT COMMENT '必卖品  0:非;1:是',
    is_seasonal             BIGINT COMMENT '季节性商品  0:非;1:是',
    seasonal_start_time     STRING COMMENT '季节性开始时间',
    seasonal_end_time       STRING COMMENT '季节性结束时间',
    is_deleted              BIGINT COMMENT '是否删除0:正常;1:删除',
    goods_type              STRING COMMENT '商品类型 1-国产食品 2-进口食品 3-国产非食品 4-进口非食品',
    create_time             TIMESTAMP COMMENT '该记录创建时间',
    update_time             TIMESTAMP COMMENT '该记录最后更新时间')
comment '商品表'
partitioned by (dt STRING COMMENT '写入日期')
row format delimited fields terminated by ','
stored as orc
tblproperties ('orc.compress'='SNAPPY');
  1. 导入

导入的话我们肯定是要,保留全部的商品,因此我们选择left join 左连接,并且我们还需要只关联昨天的数据。

insert overwrite table dim.dwd_dim_goods_i partition (dt)
select
    t1.id as goods_id,
    t1.goods_no,
    t1.goods_name,
    t2.first_category_id,
    t2.first_category_no,
    t2.first_category_name,
    t2.second_category_id,
    t2.second_category_no,
    t2.second_category_name,
    t2.third_category_id,
    t2.third_category_no,
    t2.third_category_name,
    t1.brand_no,
    t1.spec,
    t1.sale_unit,
    t1.life_cycle_status,
    t1.tax_rate_status,
    t1.tax_rate,
    t1.tax_value,
    t1.order_multiple,
    t1.pack_qty,
    t1.split_type,
    t1.is_sell_by_piece,
    t1.is_self_support,
    t1.is_variable_price,
    t1.is_double_measurement,
    t1.is_must_sell,
    t1.is_seasonal,
    t1.seasonal_start_time,
    t1.seasonal_end_time,
    t1.is_deleted,
    t1.goods_type,
    t1.create_time,
    t1.update_time,
    date_sub(current_date(),1) as dt
from dim.ods_dim_goods_info_f t1
        left join (select * from dim.dwd_dim_category_statistics_i where dt = date_sub(current_date(),1)) t2 
                        on t1.category_no = t2.third_category_no;

在这里插入图片描述

1.5 门店商品表

门店商品表:肯定就是门店表与商品分类表进行关联,然后通过店的编号进行关联
在这里插入图片描述
在这里插入图片描述

  1. 建表
CREATE TABLE IF NOT EXISTS dim.dwd_dim_store_goods_i(
    uid                     STRING COMMENT '唯一标识',
    store_no                STRING COMMENT '门店编码',
    goods_no                STRING COMMENT '商品编码',
    goods_name              STRING COMMENT '商品简称',
    first_category_no       STRING COMMENT '一级分类编码',
    first_category_name     STRING COMMENT '一级分类',
    second_category_no      STRING COMMENT '二级分类编码',
    second_category_name    STRING COMMENT '二级分类',
    third_category_no       STRING COMMENT '三级分类编码',
    third_category_name     STRING COMMENT '三级分类',
    is_clear                BIGINT COMMENT '商品是否日清,0-否,1-是',
    is_must_order           BIGINT COMMENT '是否必订品,0-否,1-是',
    is_orderable            BIGINT COMMENT '是否可订,0-否,1-是',
    order_multiple          DECIMAL(27,2) COMMENT '订货倍数',
    min_order_qty           DECIMAL(27,2) COMMENT '最小起订量',
    vendor_no               STRING COMMENT '主供应商编码',
    vendor_name             STRING COMMENT '主供应商名称',
    group_no                STRING COMMENT '采购柜组编码',
    group_name              STRING COMMENT '采购柜组名称',
    dc_no                   STRING COMMENT '采购仓库编码',
    dc_name                 STRING COMMENT '采购仓库名称',
    tag                     BIGINT COMMENT '商品标识,1-传智鲜标品;2-黑马标品;3-生鲜品;4-其它',
    create_time             TIMESTAMP COMMENT '创建时间',
    update_time             TIMESTAMP COMMENT '最后修改时间',
    is_deleted              BIGINT COMMENT '是否删除0:正常;1:删除')
comment '门店商品信息'
partitioned by (dt STRING COMMENT '写入日期')
row format delimited fields terminated by ','
stored as orc
tblproperties ('orc.compress'='SNAPPY');
  1. 导入
insert overwrite table dim.dwd_dim_store_goods_i partition (dt)
select
    t1.uid,
    t1.store_no,
    t1.goods_no,
    t1.goods_name,
    t2.first_category_no,
    t2.first_category_name,
    t2.second_category_no,
    t2.second_category_name,
    t2.third_category_no,
    t2.third_category_name,
    t1.is_clear,
    t1.is_must_order,
    t1.is_orderable,
    t1.order_multiple,
    t1.min_order_qty,
    t1.vendor_no,
    t1.vendor_name,
    t1.group_no,
    t1.group_name,
    t1.dc_no,
    t1.dc_name,
    t1.tag,
    t1.create_time,
    t1.update_time,
    t1.is_deleted,
    date_sub(current_date(),1) as dt
from dim.ods_dim_store_goods_f t1 
        join (select * from dim.dwd_dim_category_statistics_i where dt = date_sub(current_date(),1)) t2 
                on t1.category_no = t2.third_category_no;

1.6 日清门店商品表处理

在这里插入图片描述
在这里插入图片描述

  1. 建表
CREATE TABLE IF NOT EXISTS dim.dwd_dim_store_clear_goods_i(
    uid                     STRING COMMENT '唯一标识',
    store_no                STRING COMMENT '门店编码',
    goods_no                STRING COMMENT '商品编码',
    goods_name              STRING COMMENT '商品简称',
    first_category_no       STRING COMMENT '一级分类编码',
    first_category_name     STRING COMMENT '一级分类', 
    second_category_no      STRING COMMENT '二级分类编码',
    second_category_name    STRING COMMENT '二级分类',
    third_category_no       STRING COMMENT '三级分类编码',
    third_category_name     STRING COMMENT '三级分类',
    is_clear                BIGINT COMMENT '商品是否日清,0-否,1-是',
    is_must_order           BIGINT COMMENT '是否必订品,0-否,1-是',
    is_orderable            BIGINT COMMENT '是否可订,0-否,1-是',
    order_multiple          DECIMAL(27,2) COMMENT '订货倍数',
    min_order_qty           DECIMAL(27,2) COMMENT '最小起订量',
    vendor_no               STRING COMMENT '主供应商编码',
    vendor_name             STRING COMMENT '主供应商名称',
    group_no                STRING COMMENT '采购柜组编码',
    group_name              STRING COMMENT '采购柜组名称',
    dc_no                   STRING COMMENT '采购仓库编码',
    dc_name                 STRING COMMENT '采购仓库名称',
    tag                     BIGINT COMMENT '商品标识,1-传智鲜标品;2-黑马标品;3-生鲜品;4-其它',
    create_time             TIMESTAMP COMMENT '创建时间',
    update_time             TIMESTAMP COMMENT '最后修改时间',
    is_deleted              BIGINT COMMENT '是否删除0:正常;1:删除') 
comment '门店日清商品信息'
partitioned by (dt STRING COMMENT '写入日期')
row format delimited fields terminated by ','
stored as orc
tblproperties ('orc.compress'='SNAPPY');
  1. 导入
    注意我们只需要导入 ,is_clear 为 1 也就是需要日清的数据
insert overwrite table dim.dwd_dim_store_clear_goods_i partition (dt)
select
    uid,
    store_no,
    goods_no,
    goods_name,
    first_category_no,
    first_category_name,
    second_category_no,
    second_category_name,
    third_category_no,
    third_category_name,
    is_clear,
    is_must_order,
    is_orderable,
    order_multiple,
    min_order_qty,
    vendor_no,
    vendor_name,
    group_no,
    group_name,
    dc_no,
    dc_name,
    tag,
    create_time,
    update_time,
    is_deleted,
    dt
from dim.dwd_dim_store_goods_i where dt = date_sub(current_date(),1) and is_clear = 1;

1.7 门店表处理

每一个门店,都会有实际面积,经营面积,合同面积,公摊面积几种,
假设我们按照 实际面积=8,经营面积7,合同面积=1,公摊面积=2 来分类,要求门店表输出一个面积。我们应该怎么判断呢?
在这里插入图片描述

  1. 建表
CREATE TABLE IF NOT EXISTS dim.dwd_dim_store_i(
    id                      BIGINT COMMENT '自增主键',
    store_no                STRING COMMENT '分店编号',
    store_name              STRING COMMENT '分店名称',
    store_sale_type         BIGINT COMMENT '门店销售类型',
    store_type_code         BIGINT COMMENT '分店类型',
    city_id                 BIGINT COMMENT '城市ID',
    city_name               STRING COMMENT '城市名称',
    region_code             STRING COMMENT '区域ID',
    region_name             STRING COMMENT '区域名称',
    worker_num              BIGINT COMMENT '员工人数',
    manager_name            STRING COMMENT '经理姓名',
    telephone               STRING COMMENT '分店电话',
    opening_date            STRING COMMENT '开店日期',
    open_time               STRING COMMENT '营业开始时间',
    close_time              STRING COMMENT '营业结束时间',
    `status`                BIGINT COMMENT '状态 1:开店  2:闭店',
    is_deleted              BIGINT COMMENT '是否删除 0:否  1:是',
    create_time             TIMESTAMP COMMENT '创建时间',
    update_time             TIMESTAMP COMMENT '更新时间',
    store_area              DECIMAL(27,2) COMMENT '经营面积',
    decoration_code         STRING COMMENT '装修标识',
    is_day_clear            BIGINT COMMENT '是否日清,1-日清,0-非日清'
)
comment '门店表'
partitioned by (dt STRING COMMENT '写入日期')
row format delimited fields terminated by ','
stored as orc
tblproperties ('orc.compress'='SNAPPY');
  1. 导入
  • 门店表: 在门店宽表构建时,就添加了门店面积信息和区域名称信息,门店面积信息可以用来计算坪效等,区域名称信息可以用来上卷时显示区域名称。
  • 其中门店面积信息可以从分店面积明细表中获取。
    • 先取实际经营面积(8),
    • 如果取不到(实际经营面积为空或0)再取经营面积(7)。
    • 如果取不到(经营面积为空或0)再取合同面积(1)。
    • 如果取不到(合同面积为空或0)再取外滩面积(2)。
    • 总结一下: 优先级就是 8 > 7 > 1 > 2
  • 其中区域名称信息从店组信息表中取,store_group_type_no = '04’即对应区域的编码和名称。
  • 其中 management_type_code 和 store_type_code 需要转换为整数类型

想一下,我们怎么能通过优先级去取到对应的值呢?
没错,通过判断就可以,我们常用的判断方法有 if 和 case when ,因为if比较繁琐我们就可以使用case
如果 面积为 8 我们给个变量 1 ,面积为 7 我们给个变量 2,面积为 1我们给个变量 3,面积为 2 我们给个变量 4,
这样我就得到了一列只,通过对这个对变量进行升序操作取最小值也就是优先级最高的面积。

with t1 as (
    select
        store_no,
        area_type_no,
        area,
        row_number() over (
            partition by store_no
            order by (
                case
                   when area_type_no=8 then 1
                   when area_type_no=7 then 2
                   when area_type_no=1 then 3
                   when area_type_no=2 then 4
                   else 99
                end
            ) asc
        ) as rn
    from dim.ods_dim_store_area_info_f
)
, t2 as (
    select * from t1
    where rn = 1
)
insert overwrite table dim.dwd_dim_store_i partition(dt)
select
    t3.id,
    t3.store_no,
    t3.store_name,
    cast(t3.management_type_code as int) as store_sale_type,
    cast(t3.store_type_code as int) as store_type_code,
    t3.city_id,
    t3.city_name,
    t3.region_code,
    t4.store_group_name as region_name, -- 需要关联
    t3.worker_num,
    t3.manager_name,
    t3.telephone,
    t3.opening_date,
    t3.open_time,
    t3.close_time,
    t3.status,
    t3.is_deleted,
    t3.create_time,
    t3.update_time,
    t2.area as  store_area,
    t3.decoration_code,
    if(flag=16, 1, 0) as is_day_clear,
    '2024-06-21' as dt
from dim.ods_dim_store_f t3
    left join (select * from dim.ods_dim_store_group_f where store_group_type_no='04') t4 on t3.region_code=t4.store_group_no
    left join t2 on t3.store_no=t2.store_no;

2. postgrep数据库

我们都知道,我们将数据导入到HIve中将进行处理清洗,在转到本地的数据库提供给报表进行分析。

问题:按我们用什么数据库接受数据?MySQL?
其实并不是,我们在开发中使用postgrep数据库是比较常见的,因为其开源免费还有很强的功能性。

在这里插入图片描述

2.1 什么是postgrep数据库

PostgreSQL(有时也被称为“Postgres”或简称为“PG”)是一个强大的、开源的对象-关系数据库管理系统(ORDBMS)。它使用了和许多其他SQL数据库管理系统(如MySQL、SQL
Server、Oracle等)相似的查询语言,但它也提供了许多扩展功能,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制(MVCC)等。

PostgreSQL的主要特点包括:

  • 扩展性:PostgreSQL支持大量的扩展,这些扩展可以增加新的数据类型、函数、操作符、索引类型、过程语言等。
    强大的SQL标准支持:PostgreSQL遵循SQL标准,并提供了许多额外的功能。
  • 事务完整性:它支持ACID事务属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
  • 并发控制:通过多版本并发控制(MVCC),PostgreSQL允许在没有锁定整个表的情况下进行读和写操作。
  • 灵活性:用户定义的函数和操作符允许用户根据需要进行定制。
  • 安全性:PostgreSQL提供了多种安全特性,如行级安全性、加密、审计等。
  • 社区支持:PostgreSQL有一个庞大的社区,提供了大量的文档、教程、工具和帮助。
  • 跨平台:PostgreSQL可以在许多操作系统上运行,包括Linux、Unix、Windows和macOS。
    在这里插入图片描述

2.2 PostgreSQL基本操作

我们在安装好PostgreSQL数据库之后,怎么使用呢?
我们在客户端,使用命令连接。

#psql -h 服务器 -p 端口地址 -d 数据库 -U 用户名     
psql -h 127.0.0.1 -p 5432 -d postgres -U postgres
#密码:itcast123

在这里插入图片描述

  • 查看帮助命令
help   查看帮助命令

在这里插入图片描述

  • 数据库/表的基本操作
    查看库
    在这里插入图片描述
    切换数据库在这里插入图片描述

显示所有表

在这里插入图片描述
查询语句

select *
from exercise_db.public.courses;

在这里插入图片描述

2.3 Data grip 链接PostgreSQL

在这里插入图片描述
需求:

在 PostgreSQL 中创建一个名为 db_school 的数据库,并在其中创建一个包含 student_id, name, age, gender 列的 tb_student 表,并为表和列增加注释


create database exercise_db;
create table students(
  id serial primary key ,
  name varchar(20),
  age int
);

create table courses(
  course_id serial primary key ,
  course_name varchar(20),
  course_no int
);

insert into exercise_db.public.students(name,age)  values ('aaa',10), ('bbb',20), ('ccc',30);
insert into exercise_db.public.courses(course_name,course_no)  values ('语文',101), ('数学',102), ('英语',103);


select *
from exercise_db.public.courses;


select *
from students;

3. 基于DataX完成数据导出

准备条件:
在PostgreSQL数据库创建好表

  1. 首先我们创建一个数据源
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
2. 构建模板
这里我们使用之前的任务模版

  1. 创建任务
    注意: hive中以-i结尾的维表是有分区的,每个分区保存一个快照,而postgresql中只保留最新的快照数据。所以构建reader读取hive表时不需要dt字段(手动传递最新分区),导入到postgresql时,默认只导入最新的快照。
    操作如下:
    注意:在构建reader时,要指定导出的分区,指定的方式是在path中通过传参的方式,${partition}在运行时动态指定。
这个案例中path为: /user/hive/warehouse/dim.db/dwd_dim_goods_i/${partition}
注意: datax工具底层固定找的变量名叫partition,所以此处咱们变量名必须起程partition,
把分区字段值直接替换${partition}  示例: /user/hive/warehouse/dim.db/dwd_dim_goods_i/dt=2024-06-21

注意: 后续循环导出的时候,为了防止postgresql中的历史数据有脏数据,在导入之前可以先清空数据。所以在构建postgresql writer时,需要加上前置sql:truncate table public.dwd_dim_goods_i。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“论软件的可靠性评价”必过范文,软考高级,系统架构设计师论文

论文真题 软件可靠性评价是软件可靠性活动的重要组成部分,既适用于软件开发过程,也可针对最终软件系统。在软件开发过程中使用软件可靠性评价,可以使用软件可靠性模型,估计软件当前的可靠性,以确认是否可以终止测试并发布软件,同时还可以预计软件要达到相应的可靠性水平…

html做一个雷达图的软件

要实现一个在线输入数据并生成雷达图的功能&#xff0c;可以使用HTML表单和JavaScript来处理用户输入的数据。以下是一个示例代码&#xff0c;演示了如何实现这个功能&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"…

Redis进阶 - 朝生暮死之Redis过期策略

概述 Redis 是一种常用的内存数据库&#xff0c;其所有的数据结构都可以设置过期时间&#xff0c;时间一到&#xff0c;就会自动删除。你可以想象 Redis 内部有一个死神&#xff0c;时刻盯着所有设置了过期时间的 key&#xff0c;寿命一到就会立即收割。 你还可以进一步站在死神…

C/C++ vector模拟实现

模拟实现&#xff1a; 框架 namespace yx {template<class T>class vector{public:typedef T* iterator;private:iterator _start;iterator _finish;iterator _end_of_storage;}; } 这里我们声明定义不分离 reverse() 新开一个空间&#xff0c;拷贝数据&#xff0c;然…

Python-日志模块

目录 一、日志级别 二、日志配置 1、日志基本配置 2、日志配置字典&#xff08;知道咋么改就可以&#xff09; 3、日志的使用 一、日志级别 import logginglogging.debug(调试日志) logging.info(消息日志) logging.warning(警告日志) logging.error(错误日志) logging.cr…

ffmpeg音视频开发从入门到精通——ffmpeg 视频数据抽取

文章目录 FFmpeg视频处理工具使用总结环境配置主函数与参数处理打开输入文件获取流信息分配输出文件上下文猜测输出文件格式创建视频流并设置参数打开输出文件并写入头信息读取、转换并写入帧数据写入尾信息并释放资源运行程序注意事项源代码 FFmpeg视频处理工具使用总结 环境…

如何获取文件对应的路径

有时我们会把脚本文件复制到其他的路径或者电脑文件夹下&#xff0c;如果采用绝对路径的话&#xff0c;会发生找不到改文件&#xff0c;程序就会报错。那么我们如何避免这个问题呢&#xff1f;我们可以采用相对路径的方法。 可以看到&#xff0c;系统的当前路径"D:\python…

什么是距离选通型水下三维激光扫描仪?(下)

距离选通激光水下成像的发展 距离选通激光成像技术始于上世纪60年代&#xff0c;受制于高性能脉冲激光器和选通成像器件发展的制约&#xff0c;激光距离选通成像技术在随后的二十年发展缓慢&#xff0c;直到20世纪90年代&#xff0c;随着硬件技术的不断成熟&#xff0c;该技术…

VBA:demo大全

VBA常用小代码合集&#xff0c;总有一个是您用得上的~ (qq.com) 如何在各个分表创建返回总表的命令按钮&#xff1f; 今天再来给大家聊一下如何使用VBA代码&#xff0c;只需一键&#xff0c;即可在各个分表生成返回总表的按钮。 示例代码如下&#xff1a; Sub Mybutton()Dim …

房市复兴?新增贷款暴跌九成,房市接盘侠悠着点!

就在各方都认为在诸多利好政策支持下&#xff0c;房市正在复兴&#xff0c;一些分析数据似乎也显示出好转迹象&#xff0c;然而相比起这些数据&#xff0c;新增贷款或许更能证明房市的处境&#xff0c;比其他指标更具说服力。 5月份的数据显示&#xff0c;中国的新增贷款仅514亿…

Mamba: Linear-Time Sequence Modeling with Selective State Spaces论文笔记

文章目录 Mamba: Linear-Time Sequence Modeling with Selective State Spaces摘要引言 相关工作(SSMs)离散化计算线性时间不变性(LTI)结构和尺寸一般状态空间模型SSMs架构S4(补充)离散数据的连续化: 基于零阶保持技术做连续化并采样循环结构表示: 方便快速推理卷积结构表示: 方…

海报设计师的福音来了,微软联合清华北大提出Glyph-ByT5-v2,可支持多国语言图文海报生成,效果惊艳!

清华&北大&微软&利物浦大学联合提出Glyph-ByT5-v2这款工具支持多语言图文生成&#xff0c;包括英语、中文、日文、韩文、法文、德文、西班牙文、意大利文、葡萄牙文和俄文。 以下分别展示中、英、日、韩图文的视觉文本结果一起带大家感受一下。 相关链接 论文地址…

6G时代,即将来临!

日前&#xff0c;由未来移动通信论坛、紫金山实验室主办的2024全球6G技术大会在南京召开。本次大会以“创新预见6G未来”为主题&#xff0c;在大会开幕式上发布了协力推进全球6G统一标准行动的倡议和紫金山科技城加速培育以6G技术引领未来产业行动计划。 在我国已开展第五代移动…

苹果手机safari浏览器的userAgent显示为电脑的userAgent问题解决

目录 1.问题背景 2.userAgent 3.解决 1.问题背景 开发了一个H5&#xff0c;是通过生成二维码&#xff0c;扫描这个二维码后就跳到这个H5&#xff0c;所以需要判断一下扫描的设备是否为手机&#xff0c;然后由于业务逻辑还需要判断一下手机是Android、iOS还是iPad。一般前端…

Shell 编程之条件语句

Shell 编程之条件语句 一、条件测试操作test命令文件测试整数值比较字符串比较逻辑测试 二、if条件语句单分支 if 语句双分支 if 语句多分支 if 语句 三、case 分支语句case语句的结构case 语句应用示例 四、注意事项 在Shell编程中&#xff0c;条件语句是非常重要的一部分&…

Docker 下载与安装以及配置

安装yum工具 yum install -y yum-ulits配置yum源 阿里云源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Docker 17.03后为两个版本&#xff1a; 社区版&#xff08;Community Edition&#xff0c;缩写为 CE&#x…

获取时间戳是使用System.currentTimeMillis()还是使用new Date().getTime()(阿里开发规范)?

1.阿里规范 在阿里的Java开发手册中强制要求使用System.currentTimeMillis() 2.为什么(源码详解) new Date().getTime()它实际上也是调用的System.currentTimeMillis()&#xff0c;源码分析。 这个fastTime是它的成员变量&#xff0c;在new Date()的时候就被赋值了。 扩展一…

191.回溯算法:组合总和|||(力扣)

代码解决 class Solution { public:vector<vector<int>> result; // 存储所有符合条件的组合vector<int> res; // 当前组合// 回溯函数void backtracing(int k, int n, int index, int sum) {// 如果当前组合的长度等于k&#xff0c;且总和等于nif (res.si…

Django 模版变量

1&#xff0c;模版变量作用 模板变量使用“{{ 变量名 }}” 来表示模板变量前后可以有空格&#xff0c;模板变量名称&#xff0c;可以由数字&#xff0c;字母&#xff0c;下划线组成&#xff0c;不能包含空格模板变量还支持列表&#xff0c;字典&#xff0c;对象 2&#xff0c;…

odoo17 小变更4

odoo17 小变更4 1、代码中去除了访问私人地址权限,但翻译中均还有,怪不 model:res.groups,name:base.group_private_addresses msgid "Access to Private Addresses" msgstr "" 代码也查看了,的确没有了此权限组 --><record model="res.g…