【Hive系列】hive常用SQL

该博客主要分享了关于Hive的数据操作技巧,包括查找重复数据、修改表名、删除分区数据、清空表、数据迁移,以及创建临时表、建表和批量插入数据的方法。此外,还涉及到了一些Java核心技术点和常用开发工具的总结,旨在提供一个学习和交流的技术平台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

一.常用

1.重复数据

SELECT period_sdate, product_key, size_code, managing_city_no
FROM ads_sense_rep.ads_day_city_brand_sku_size_rep
GROUP BY period_sdate, product_key, size_code, managing_city_no
HAVING COUNT(*) > 1;

2.修改表名

ALTER TABLE ads_sense_rep.table_name RENAME TO ads_sense_rep.table_name;

3.删除分区表指定数据

alter table ads_sense_rep.table_name
 drop partition (partition_day = '2022-05-18');

4.清空表

TRUNCATE TABLE db.table;

5.迁移数据

insert into ads_sense_rep.table_name partition (partition_day)
SELECT `product_key`,
       `period_sdate`,
       `total30_sal_qty_store_rate`,
       `partition_day`
FROM ads_sense_rep.table_name;

6.hive 查询失败

需要先执行以下语句

set hive.compute.query.using.stats=false;

7.创建临时表

DROP TABLE if EXISTS ads_sense_rep.tmp_table_${bizdate};
CREATE TABLE if NOT EXISTS ads_sense_rep.tmp_table_${bizdate} AS
SELECT DISTINCT sku.product_code
FROM ads_sense_rep.table sku
WHERE sku.brand_detail_no = '01'
  AND sku.gender_name IN ('男', '女')
  AND sku.category_name1 = '鞋'
  AND sku.begin_date IS NOT NULL
;

8.建表

CREATE TABLE `ads_sense_rep.ads_dim_natural_year_week_info`(
  `financial_year` int COMMENT '自然年',
  `financial_year_week` int COMMENT '自然年周',
  `financial_year_start` date COMMENT '当前自然年开始日期',
  `financial_year_end` date COMMENT '当前自然年结束日期',
  `week_start_day` date COMMENT '当前自然年周开始日期',
  `week_end_day` date COMMENT '当前自然年周结束日期')
COMMENT '自然年维度表';

9.批量插入数据

INSERT INTO ads_sense_rep.ads_dim_natural_year_week_info
( financial_year, financial_year_week, financial_year_start, financial_year_end, week_start_day, week_end_day)
VALUES
(2016, 1, '2016-01-01', '2016-12-31', '2016-01-01', '2016-01-03'),
(2016, 2, '2016-01-01', '2016-12-31', '2016-01-04', '2016-01-10'),
(2016, 3, '2016-01-01', '2016-12-31', '2016-01-11', '2016-01-17'),
(2016, 4, '2016-01-01', '2016-12-31', '2016-01-18', '2016-01-24'),
(2016, 5, '2016-01-01', '2016-12-31', '2016-01-25', '2016-01-31'),
(2025, 53, '2025-01-01', '2025-12-31', '2025-12-29', '2025-12-31');

二.不常用

1.创建表

-- 带分区
CREATE TABLE `ads_sense_rep.table_name`
(
    `product_key`                string COMMENT '商品主键',
    `period_sdate`               date COMMENT '日期(yyyy-mm-dd)',
    `size_code`                  string COMMENT '尺码',
    `total7_sal_qty_store_rate`  decimal(18, 4) COMMENT '累计7天转化率',
    `total30_sal_qty_store_rate` decimal(18, 4) COMMENT '累计30天转化率'
) PARTITIONED BY ( `partition_day` string);

-- 不带分区
CREATE TABLE `ads_sense_rep.tabel_name`
(
    `product_key`                string COMMENT '商品主键',
    `period_sdate`               date COMMENT '日期(yyyy-mm-dd)',
    `size_code`                  string COMMENT '尺码',
    `total7_sal_qty_store_rate`  decimal(18, 4) COMMENT '累计7天转化率',
    `total30_sal_qty_store_rate` decimal(18, 4) COMMENT '累计30天转化率'
) ;


-- 带描述
CREATE TABLE `ads_sense_rep.table_name`
(
    `product_key`  string COMMENT '商品主键',
    `period_sdate` date COMMENT '日期(yyyy-mm-dd)',
    `size_code`    string COMMENT '尺码'
) COMMENT '对方答复'
PARTITIONED BY (`partition_day` string);

2.修改表注释

ALTER TABLE ads_sense_rep.table_name SET TBLPROPERTIES ('comment' = '对方答复');

3.添加字段

alter table ads_sense_rep.table_name
    add columns (sex string comment '性别');

4.更新数据

update ads_sense_rep.table_name
set sex='女'  where id =1;

5.hive 导数据到 ck

INSERT
	into
	default.table_name
select
	*
from
	jdbc('ch-server','select * from ads_sense_rep.table_name')

6.设置 broadcastTimeout

set spark.sql.broadcastTimeout=30000;

7.耗时统计

select COUNT(*) as querySlowCnt from system.query_log WHERE query_duration_ms > 2000 and `type` = 2;

8.刷新表

REFRESH TABLE bdc_dws.dws_day_org_pro_size_sal_ds;

9.前一天

格式:${bizdate}
结果:20220608
date_sub(date_format(now(), 'yyyy-MM-dd'), 1)
date_format(now(), 'yyyy-MM-dd') AS etl_time --跑数时间

10.with as 写法

WITH tmp_dim_pro_allinfo AS (
    SELECT product_key
    FROM bdc_dim.table
    WHERE gender_name = '女'
      AND category_name1 = '鞋'
      AND brand_detail_no = 'SD01'
)
SELECT *
FROM tmp_dim_pro_allinfo;

11.分区

INSERT INTO ads_sense_rep.ads_day_city_brand_sku_rep PARTITION(partition_day)
SELECT product_key
FROM bdc_dim.table;

12.分区的区别?

order by,sort by,distribute by,cluster by

  • oreder by: 主要是做全局排序。
  • sort by :局部排序
  • distribute by :分区
  • cluster by:当分区数量小于字段种类时,就有意义。
    • 当 distribute by 和 sort by 所指定的字段相同时,即可以使用 cluster by。
    • 注意:cluster by 指定的列只能是降序,不能指定 asc 和 desc。

13.表插入更新

insert into table  #在表后直接插入,不去重

insert overwrite table   #将原表清空后,再插入数据。

14.nvl 函数

nvl 和 if null 等价

15.创建分区表

CREATE TABLE `db_name.table_name`
(
    `financial_year`                 int COMMENT '财年',
    `financial_year_week`            int COMMENT '财年第n周',
    `managing_city_no`               string COMMENT '城市编码',
    `etl_time`                       date COMMENT '处理时间'
) comment '城市-品类洞察-品牌概览表'
PARTITIONED BY (
  `partition_financial_year` INT
    ,`partition_financial_year_week` INT);
--插入数据
INSERT INTO TABLE db_name.table_name    PARTITION(partition_financial_year,partition_financial_year_week)
SELECT financial_year                         AS financial_year                 --财年
     , financial_year_week                    AS financial_year_week            --第几周
     , date_format(now(), 'yyyy-MM-dd')       AS etl_time                       --跑数时间
     , financial_year                         AS partition_financial_year       --分区财年
     , financial_year_week        AS partition_financial_year_week  --分区财年周
FROM ads_sense_rep.xxxxx distribute BY partition_financial_year,partition_financial_year_week,CAST(rand() * 20 AS INT)
;

16.获取日期的年份

YEAR (t2.financial_year_start)

17.获取周开始结束

WHERE week_start_day >= date_sub(CURRENT_DATE, 6 + CAST(date_format(CURRENT_DATE, 'u') AS int)) --上周的第一天
  AND week_end_day <= date_sub(CURRENT_DATE, CAST(date_format(CURRENT_DATE, 'u') AS int)) --上周的最后一天
;

18.获取月开始结束

WHERE month_start_day >= trunc(add_months(CURRENT_DATE, -1), 'MM') --上个月的第一天
  AND month_end_day <= last_day(date_sub(CURRENT_DATE, DAY(CURRENT_DATE))) --上个月的最后一天
;

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

檀越@新空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值