文章目录
-
- 1、datagrip的使用
- 2、数仓中增加字段怎么办?
- 3、hive on spark和spark on hive啥区别
- 4、拉链表(维度表下的新增和变化)
- 5、hbase中的数据怎么能到hive里面呢?
- 6、问题(mysql中的时间字段到hive中)
- 7、储存活跃日期
- 8、hdfs到datax的数据导入储存格式的问题
- 9、hive中的内部表
- 10、动态分区表
- 11、hive表的创建和加载数据
- 12、行转列与列转行
- 13、窗口函数
- 14、rank相关的函数
- 15、自定义UDF函数
- 16、SQL执行顺序
- 17、hive中的fetch
- 18、groupby和count(distinct)的底层机制和区别是什么?
- 19、两张表join的时候,mr是怎么做的?
- 20、日期格式转换
- 21、事实表
- 22、数仓建模的工具
1、datagrip的使用
1.1、如何使用datagrip连接hive呢?
启动起hadoop集群(因为要在hdfs上看),然后启动hiveserver2(在家目录~下 nohup hiveserver2 &),然后就可以用datagrip了。
如果想用hive的客户端,也就是图形化工具,例如datagrip图形化工具的时候。就需要在启动hadoop之后,启动hiveserver2。
需要注意的是:hive所在的机器,xshell一定要连接上,如果连接不上,就会报错。
---- hive安装在了第一台机器上,结果第一台机器上xshell就是连接不上。然后xshell连接上了第二台机器,然后想着用ssh 第一台机器,然后就相当于是连接上第一台机器了,这样做是错误的。datagrip会抱错误:java.net.UnknownHostException,也就是会爆出连接不上hive所在的机器,这样做就是让客户端连接不到hive。
启动了多种服务的话,不知道哪个进程?
jpsall -ml ,也就是关键的 -ml。jpsall是自己配置的脚本。
1.2、写SQL时候的快捷键
行显示转换为列显示。
Ctrl + Alt + l,字段在一行的时候,转换为列显示。
修改某一列的数据
Alt + shift,然后鼠标左击某个位置,依次往下点击,也就是点击一列。于是就可以同时修改。
2、数仓中增加字段怎么办?
1.整个数仓有几张要增加字段的,就执行改几张,分区表改的时候有些区别。
2.这种方法有时候不太保险,最好的是,对应的表你重建一张表,把原来表的数据into进去,新加字段补null。
//因为原来的表中没有新添加的额那个字段,所以给新添加的按个字段赋值为null。
就像这样。
insert overwrite 新表
select * ,null as 新字段 from 原表。
重建表的时候,还是用原来的创建表的脚本,就是里面加上我们要添加的字段。
3.之后再把原来的表删除,新表改成原来表的表名。
先建张新表,把字段加进来,然后把老表的数据insert 进来,新加的字段位置补null替代,查看数据正常后,把老表先改名加_back,用于备份,新表改成老表名,整个流程结束
3、hive on spark和spark on hive啥区别
spark on hive 计算引擎用的spark,其他的是hive。
底层前者是rdd,后者是df或者ds。
4、拉链表(维度表下的新增和变化)
拉链表:缓慢变化维度,注意是缓慢变化维度。注意缓慢这两个字。缓慢变化维度表,不设置分区表,就是一张表。注意是维度表哦!! 每天在更新,调度任务脚本是每天在跑,每天在进行拉链。
4.1、拉链表的创建过程(全量表,没有分区的时候)
----------拉链表-----------
--1.创建拉链表
create external table dwd_dim_user_info_his
(
`id` string COMMENT '用户id',
`name` string COMMENT '姓名',
`birthday` string COMMENT '生日',
`gender` string COMMENT '性别',
`email` string COMMENT '邮箱',
`user_level` string COMMENT '用户等级',
`create_time` string COMMENT '创建时间',
`operate_time` string COMMENT '操作时间',
`start_date` string COMMENT '有效开始日期',
`end_date` string COMMENT '有效结束日期'
) COMMENT '用户拉链表'
stored as parquet
location '/warehouse/gmall/dwd/dwd_dim_user_info_his/'
tblproperties ("parquet.compression" = "lzo");
--2,初始化拉链表
insert overwrite table dwd_dim_user_info_his
select id,
name,
birthday,
gender,
email,
user_level,
create_time,
operate_time,
'2020-06-14' start_date,
'9999-99-99' end_date
from ods_user_info
where dt = '2020-06-14';
--3.创建临时拉链表
create external table dwd_dim_user_info_his_tmp
(
`id` string COMMENT '用户id',
`name` string COMMENT '姓名',
`birthday` string COMMENT '生日',
`gender` string COMMENT '性别',
`email` string COMMENT '邮箱',
`user_level` string COMMENT '用户等级',
`create_time` string COMMENT '创建时间',
`operate_time` string COMMENT '操作时间',
`start_date` string COMMENT '有效开始日期',
`end_date` string COMMENT '有效结束日期'
) COMMENT '订单拉链临时表'
stored as parquet
location '/warehouse/gmall/dwd/dwd_dim_user_info_his_tmp/'
tblproperties ("parquet.compression" = "lzo");
--4.拉链
set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
insert overwrite table dwd_dim_user_info_his_tmp
select *
from (
select id,
name,
birthday,
gender,
email,
user_level,
create_time,
operate_time,
'2020-06-15' start_date,
'9999-99-99' end_date
from ods_user_info
where dt = '2020-06-15'
union all
select old.id,
old.name,
old.birthday,
old.gender,
old.email,
old.user_level,
old.create_time,
old.operate_time,
old.start_date,
`if`(new.id is not null and old.end_date = '9999-99-99', date_add(new.dt, -1