Hive 语法使用记录

count

count是一种最简单的聚合函数,一般也是我们第一个开始学习的聚合函数,那么他们之间究竟由什么区别呢?

有的人说count(1)和count(*)他们之间有区别,而有的人说他们之间没有区别那么他们之间到底有没有区别呢。

从执行结果来说:

    count(1)和count(*)之间没有区别,因为count(*)count(1)都不会去过滤空值,

     但count(列名)就有区别了,因为count(列名)会去过滤空值。

从执行效率来说:

     他们之间根据不同情况会有些许区别,MySQL会对count(*)做优化。

     (1)如果列为主键,count(列名)效率优于count(1)  

     (2)如果列不为主键,count(1)效率优于count(列名)  

     (3)如果表中存在主键,count(主键列名)效率最优  

     (4)如果表中只有一列,则count(*)效率最优  

      (5)如果表有多列,且不存在主键,则count(1)效率优于count(*)

补充关于count(1)count(*)原理 引用百度知道专业回答

count(1),其实就是计算一共有多少符合条件的行。
1并不是表示第一个字段,而是表示一个固定值。
其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.

count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。

having函数,case when与order by

having:用于筛选分组后的各组数据。
聚合函数,和group by一起使用(where不能和聚合函数使用)
group by放在order by前使用,放在之后报错
SELECT user_id from user_role r GROUP BY r.user_id HAVING COUNT(r.role_id)>=4 ORDER BY user_id DESC; 查询role_id大等于4的user_id

case when与order by,自己设置排序规则
SELECT * FROM user WHERE state=1
ORDER BY
(
CASE name
WHEN ‘总部管理员’ THEN 1
WHEN ‘机构管理员’ THEN 2
WHEN ‘主管’ THEN 3
ELSE 4
END
) ASC

Case When Then Else End 多条件判断

https://www.cnblogs.com/gengyufei/p/12614387.html

select substr(key,13,2),
case when birthday<‘1968’ then ‘50up’
when birthday<‘1978’ then ‘40-50’
when birthday<‘1983’ then ‘35-40’
when birthday<‘1988’ then ‘30-35’
when birthday<‘1992’ then ‘26-30’
when birthday<‘1998’ then ‘20-25’
else ‘other’ end,
count(1)
from hiveTable
group by substr(key,13,2),
case when birthday<‘1968’ then ‘50up’
when birthday<‘1978’ then ‘40-50’
when birthday<‘1983’ then ‘35-40’
when birthday<‘1988’ then ‘30-35’
when birthday<‘1992’ then ‘26-30’
when birthday<‘1998’ then ‘20-25’
else ‘other’ end

case when/having/自连接/时间窗口

https://blog.youkuaiyun.com/a550246215/article/details/108166635

where 1=1或2的作用

where 后面表示过滤的条件,只有满足条件的记录才被选择,因为条件(1=2)为假,
所以整句话其实就是什么都不选择,比如我要建一个和表a相同结构的表b 但我不要数据就可以:

select * into 表b from 表a where 1=2

这样实现了拷贝一个表结构的目的;

如果条件是“1=1”就是选择所有记录。

写 where 1=1 就是为了在编程语言中使用,在语言中可能用户输入条件,也有可能不输入条件,这时可以这样:

如果输入了条件则为 and 字段=变量值,如果没有输入则为空值
组合后变成:select * from tablename where 1=1 and 字段=变量值

或 select * from tablename where 1=1

Hive中count,sum的使用

https://blog.youkuaiyun.com/yjgithub/article/details/84568542

left join 和 left outer join 的区别

https://www.cnblogs.com/williamjie/p/9498032.html

### HiveQL语法教程和示例 #### 创建表 为了创建一个新的表格,在Hive中可以使用`CREATE TABLE`语句。此语句允许指定列名及其相应的数据类型,还可以设置分区、分桶以及存储格式等属性[^3]。 ```sql CREATE EXTERNAL TABLE IF NOT EXISTS employee ( name STRING COMMENT '员工姓名', age INT, salary FLOAT) COMMENT '这是一个关于公司员工的信息表' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION '/user/hive/warehouse/employee'; ``` #### 插入数据到表 向已存在的表里插入新记录可以通过多种方式完成,比如直接写入静态值或者从其他表读取并加载数据。下面的例子展示了如何利用`INSERT INTO`来添加一条或多条记录: ```sql -- 单行插入 INSERT INTO employee VALUES ('John Doe', 30, 7500); -- 多行批量插入 INSERT INTO employee VALUES ('Jane Smith', 28, 6900), ('Alice Brown', 45, 12000); ``` 对于更复杂的情况,则可能需要用到`SELECT ... INSERT OVERWRITE`结构来进行跨表操作或执行转换逻辑后再存入目标位置。 #### 查询数据 基本的选择查询遵循标准SQL模式,即通过`SELECT * FROM table WHERE condition;`的形式获取所需的结果集。然而值得注意的是由于性能考虑等因素的影响,某些特定功能如索引查找并未被实现;因此建议尽可能优化过滤条件以减少扫描范围。 ```sql -- 获取所有年龄大于等于30岁的雇员名单 SELECT name FROM employee WHERE age >= 30; -- 统计各部门平均薪资水平 SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department; ``` 另外需要注意一点就是当涉及到多个大尺寸的数据源联合分析时,应当谨慎评估Join策略所带来的开销成本,并尝试采用Map-side Join或其他高效算法替代传统嵌套循环连接方法。 #### 更新与删除 遗憾地讲,目前版本下的Hive并不支持直接修改现有记录的操作(UPDATE),这意味着一旦录入错误就需要借助额外手段绕过这个限制——例如重建整个分区甚至整张表。同样地DELETE语句也不存在于官方文档之中[^2]。 #### 使用命令行客户端运行HiveQL脚本 除了交互式的shell环境外,还能够编写批处理作业提交给集群执行。此时便要用到了CLI工具所提供的选项参数,像-e用于传递单个指令字符串而-f则是指向包含一系列待解析表达式的外部文件路径。 ```bash hive -e "SHOW DATABASES;" hive -f /path/to/query.sql ``` 以上便是有关HiveQL的一些基础知识要点及实际应用案例说明。希望这些信息能帮助理解该技术框架的工作机制并对日常开发有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值