Hive SQL整理

collect_set

  • 作用:把一个字段中的值组合到一个集合中,搭配where(筛选)、group by使用;
  • 用途:可将非group by字段进行转换,使其可以查询;
  • 示例:
-- id:用户;time:登陆日期
select id,collect_set(time) as t from t_action_login where time<='20150906' group by id

该查询结果如下:

  123@163.com                                                                                      | ["20150620","20150619"]                                                                                    |
| abc@163.com                                                                                      | ["20150816"]                                                                                               |
| cde@qq.com                                                                                       | ["20150606","20150608","20150607","20150609","20150613","20150610","20150616","20150615"]                  |
| 789@sohu.com                                                                                     | ["20150827","20150623","20150627","20150820","20150823","20150612","20150717"]                             |
| 987@163.com                                                                                      | ["20150701","20150829","20150626","20150625","20150726","20150722","20150629","20150824","20150716","20150 |
| ddsf@163.com                                                                                     | ["20150804","20150803","20150801","20150809","20150807","20150806","20150905","20150904","20150730","20150 |
| 182@163.com                                                                                      |["20150803","20150801","20150809","20150808","20150805","20150806","20150906","20150904","20150730","20150 |
| 22225@163.com                                                                                    | ["20150604","20150609","20150622","20150827","20150625","20150620","20150613","20150610","20150614","20150 |
| 18697@qq.com                                                                                     | ["20150902"]                                                                                               |
| 1905@qq.com                                                                                      | ["20150709"]                                       


该结果显示每个用户在2015年9月6日之前的全部登陆时间

  • 场景应用:在hive中求出一个数据表中在2015年9月6日首次登陆的人数
    对应SQL语句:
select count(a.id) from (select id,collect_set(time) as t from t_action_login where time<='20150906' group by id) as a where size(a.t)=1 and a.t[0]='20150906'

注意:size(a.t)=1 and a.t[0]='20150906'

参考:https://blog.youkuaiyun.com/liyantianmin/article/details/48262109

group by

  • hive不允许直接查询访问非group by的字段,错误示例:

select name,sex from people group by sex;
该语句会报错,因为name是非group by字段,解决方法如下:

  1. 只查询group by字段:
    select sex from people group by sex;
  2. 对于非group by字段,只通过聚合函数查询:
    select sex,count(name) from people group by sex;
  3. 对于非group by字段,通过collect_set等函数转换后查询:
    select sex,collect_set(name)[0] as name from people group by sex;
    注:可以用原字段名称;

grouping sets

  • 用途:可以按照多个标准进行分组,增强group by的功能;
  • 示例:查询每个部门每类工作平均工资、每个部门的平均工资及整个企业中每个雇员的平均工资
select department_id,job_id,avg(salary)
from hr.employees
group by grouping sets ((department_id,job_id),department_id,()); 
-- ()表示对整体进行一次聚类
-- 也可以写成:
select department_id,job_id,avg(salary)
from hr.employees
group by department_id,grouping sets ((department_id,job_id),());

limit

  • 用途:限制查询/返回的条数;
  • 用法:
    • 指定初始位置: limit 初始位置,条数
    • 不指定初始位置: limit 条数
    • 由offset指定初始位置: limit 条数 offset 初始位置
  • 说明:
    • 初始位置:下标(从0开始),表示从该位置开始返回;
    • 条数:表示返回的记录数

参考:https://blog.youkuaiyun.com/qq_33801641/article/details/107196036

<think>好的,我现在要处理用户关于Hive SQL的查询。用户提到想了解Hive SQL的使用教程或参考手册,并且系统提示需要结合给定的三个引用内容来回答。首先,我需要确认用户的需求是什么。用户可能是一个刚开始学习Hive SQL的新手,需要基础的指南和参考资料,或者他们可能在寻找具体的操作步骤,比如如何执行DDL、DML语句,或者时间函数的使用方法。 接下来,我需要回顾提供的三个引用内容。引用[1]提到了Hive SQL的开发规范,包括DDL、DML、DQL,这可能涵盖创建表、数据操作和查询的基础知识。引用[2]涉及如何导入数据Hive表,使用了HDFS命令,这可能对用户理解数据加载有帮助。引用[3]则详细说明了Hive的时间函数,比如current_timestamp的使用,这对处理时间相关的查询很重要。 用户的问题比较广泛,所以需要将这三个引用内容整合起来,提供一个结构化的回答。可能需要分部分讲解,比如基础知识、数据操作、函数使用等。同时,根据系统指令,需要生成相关问题,并确保正确使用LaTeX格式,不过用户的问题中可能不涉及数学公式,但如果有提及变量或函数名,可能需要用行内格式。 还需要检查是否有遗漏的信息。例如,用户可能需要具体的示例代码,但引用中提供的代码片段是HDFS命令和Hive SQL的例子,可以适当引用。另外,引用[1]提到规范化开发的重要性,这可能需要在回答中强调代码的可读性和性能优化。 此外,需要确保回答使用中文,结构清晰,分步骤说明。可能的结构包括: 1. Hive SQL基础:DDL、DML、DQL的基本概念和示例。 2. 数据导入导出:如何通过HDFS命令导入数据,如引用[2]中的例子。 3. 常用函数:比如时间函数current_timestamp,如引用[3]所述。 4. 开发规范:可读性、维护性、性能优化建议,引用[1]的内容。 5. 学习资源推荐:官方文档、教程链接等。 生成的相关问题需要围绕用户可能感兴趣的后续内容,比如优化技巧、更多函数的使用,或者实际应用场景。 需要注意引用标识的正确添加,比如在提到开发规范时标注[^1],在数据导入部分标注[^2],时间函数部分标注[^3]。同时,避免任何格式错误,确保LaTeX的正确使用,尽管当前内容可能不需要数学公式,但如果有涉及变量的地方,需要用$符号包裹。 最后,检查是否符合用户可见层的指示,回答结构清晰,逐步解决问题,并保证信息的可靠性,引用提供的参考资料。</think>以下是为您整理Hive SQL核心内容指南,结合开发规范、数据操作和常用函数: --- ### 一、Hive SQL基础操作 #### 1. **数据定义语言(DDL)** 用于创建/修改表结构,例如: ```sql -- 创建表(引用[1]) CREATE TABLE IF NOT EXISTS example_db.users ( id INT, name STRING, register_time TIMESTAMP ) PARTITIONED BY (dt STRING) STORED AS ORC; ``` 关键规范: - 使用明确的分区字段(如日期`dt`)提升查询效率 - 优先选择列式存储格式(ORC/Parquet) #### 2. **数据操作语言(DML)** **数据导入**(引用[2]): ```bash # 通过HDFS命令导入CSV数据 hadoop fs -put local_data.csv /user/hive/warehouse/example_db/ ``` **插入数据**: ```sql INSERT INTO TABLE users PARTITION(dt='2023-10') SELECT id, name, register_time FROM temp_table; ``` --- ### 二、常用函数与查询 #### 1. **时间函数**(引用[3]) - 获当前时间戳:`SELECT CURRENT_TIMESTAMP AS ts;` 输出:`2023-10-19 10:27:00.042` 注意:同一查询中多次调用返回相同值 - 时间格式化: `SELECT DATE_FORMAT(register_time, 'yyyy-MM') FROM users;` #### 2. **字符串处理** 查找特定字符位置: `SELECT INSTR(name, '@') FROM users WHERE name LIKE '%@%';` --- ### 三、开发规范建议 1. **可读性** - 使用缩进对齐子查询 - 添加注释说明复杂逻辑 ```sql -- 统计每日活跃用户(引用[1]) SELECT dt, COUNT(DISTINCT id) AS active_users FROM example_db.users WHERE login_count > 0 GROUP BY dt; ``` 2. **性能优化** - 避免`SELECT *`,明确指定字段 - 开启谓词下推:`SET hive.optimize.ppd=true;` --- ### 四、学习资源推荐 1. **官方手册** [Apache Hive官方文档](https://hive.apache.org/) 2. **实战教程** - 《Hive编程指南》 - 阿里云开发者社区-Hive最佳实践 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值