Hivesql里的limit使用误区

本文介绍了如何在Hive中高效地查询前1000行数据,并从中筛选出不重复的refid和imsi字段。通过对比错误和正确的SQL写法,文章详细解释了为什么某些查询方式更优,并给出了具体的实现步骤。
select * from HIVE_D_MT_UU_H_SPARK limit 1000;
读取前1000行。


需求:
在hive表前1000行里,过滤出不重复的refid,imsi。
错误的写法:
select distinct refid,imsi from HIVE_D_MT_UU_H_SPARK limit 1000;
会去读取全表,把0~1000行的不重复refid,imsi显示出来。

正确的写法:
select distinct refid,imsi from (select * from HIVE_D_MT_UU_H_SPARK limit 1000);


调优的写法:
CREATE TABLE TEMP_HIVE_D_MT_UU_H_SPARK AS
select * from HIVE_D_MT_UU_H_SPARK limit 1000;
select distinct refid,imsi from TEMP_HIVE_D_MT_UU_H_SPARK;


hive最快的执行就是不走MapReduce。简单的select的是最快的,嵌套啥的都比较忙。与关系型数据库不同。
调优的写法执行更快。



### 时间字符串转换为小时 在 HiveSQL 中,若需要将字符串形式的时间数据转换为小时,可以结合 `unix_timestamp` 和 `from_unixtime` 函数进行操作。具体步骤是:先将原始字符串转换为 Unix 时间戳,再通过 `from_unixtime` 提取小时部分。 例如,若字段 `created_timestamp` 的格式为 `'yyyy-MM-dd HH:mm:ss'`,可以通过以下方式提取小时部分: ```sql SELECT from_unixtime(unix_timestamp(created_timestamp, 'yyyy-MM-dd HH:mm:ss'), 'HH') AS hour_part FROM sog_l1screen.v1_test_dw_sp_content_track_txt_dt LIMIT 10; ``` 该查询将 `created_timestamp` 字段解析为 Unix 时间戳,并使用 `from_unixtime` 函数将其格式化为仅包含小时的部分[^2]。 若时间字符串为 13 位时间戳(如 `apptime` 字段),则需先将其转换为秒级时间戳(除以 1000),再使用 `from_unixtime` 提取小时信息: ```sql SELECT from_unixtime(cast(apptime / 1000 AS bigint), 'HH') AS hour_part FROM sog_l1screen.dw_l1_display_orc_dt WHERE dt = '20171126' LIMIT 10; ``` 此方式可有效处理字符串形式的时间字段,并提取所需的时间粒度[^2]。 ### 时间格式化函数说明 Hive 中的 `from_unixtime` 函数用于将 Unix 时间戳转换为指定格式的字符串,支持格式化参数如 `'yyyy-MM-dd'`、`'HH:mm:ss'` 等。通过设置格式字符串 `'HH'`,可以仅提取小时部分[^2]。 ### 时间戳处理注意事项 在处理字符串转换为小时时,需确保原始数据的格式与 `unix_timestamp` 函数中指定的格式一致。若格式不匹配,可能导致解析失败或返回 `NULL` 值。 此外,对于 13 位时间戳(毫秒级),必须先将其转换为秒级时间戳(除以 1000),再传入 `from_unixtime` 函数中处理,否则可能导致时间偏差。 ### 示例:提取小时并进行分组统计 以下示例展示如何提取小时并进行分组统计: ```sql SELECT from_unixtime(cast(apptime / 1000 AS bigint), 'HH') AS hour, COUNT(1) AS count FROM sog_l1screen.dw_l1_display_orc_dt WHERE dt = '20170821' GROUP BY from_unixtime(cast(apptime / 1000 AS bigint), 'HH'); ``` 该查询将 `apptime` 字段转换为小时,并按小时统计记录数[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

松门一枝花

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

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

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

打赏作者

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

抵扣说明:

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

余额充值