SQL语句在Hive中的转换

Hemers 2014-05-21 06:20:54
加精
A B
2014050201 新街口
2014050202 新街口
2014050203 新街口
2014050204 鼓楼
2014050205 岔路口
2014050206 岔路口
2014050207 新街口
2014050208 新街口

排重算法:
SELECT *
FROM TEST AS T
WHERE NOT EXISTS (SELECT 1
FROM TEST AS B
WHERE B.B = T.B
AND B.A < T.A
AND NOT EXISTS (SELECT 1
FROM TEST AS C
WHERE C.B != T.B
AND C.A < T.A
AND C.A > B.A))
ORDER BY A

结果:
2014050201 新街口
2014050204 鼓楼
2014050205 岔路口
2014050207 新街口

请大牛帮忙看看如下语句如何在Hive中进行转换,或者换种方式实现相同的算法,谢谢。
...全文
4470 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
li72li72 2014-06-02
  • 打赏
  • 举报
回复
引用 11 楼 lili72 的回复:
[quote=引用 4 楼 tntzbzc 的回复:]

#准备测试数据

cat /home/hadoop/hemers.txt 
2014050201      新街口
2014050202      新街口
2014050203      新街口
2014050204      鼓楼
2014050205      岔路口
2014050206      岔路口
2014050207      新街口
2014050208      新街口

#创建测试数据表
CREATE EXTERNAL TABLE IF NOT EXISTS testdb.hemers(
 date STRING,
 ts STRING
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

#导入数据
LOAD DATA LOCAL INPATH '/home/hadoop/hemers.txt' OVERWRITE INTO TABLE testdb.hemers;

#执行SQL

use testdb;

select t1.date,t1.ts from hemers t1
  inner join(
   select dt,count(1)ct1,count(distinct ts)ct2 from (
     select unix_timestamp(date,'yyyyMMddhh') dt,date,ts from hemers a
     union all
     select unix_timestamp(date,'yyyyMMddhh')+3600 dt,date,ts from hemers b
   )c group by dt
   having count(1)=1 or ct2=2
)t2 on unix_timestamp(t1.date,'yyyyMMddhh') =t2.dt;


#输出

2014050201      新街口
2014050204      鼓楼
2014050205      岔路口
2014050207      新街口

如果你的数据不是按小时连续排列的,请用rownumber代替
经测试,没有达到预期的效果。[/quote] 可以达到效果的,开始是我的数据格式不对。
li72li72 2014-06-02
  • 打赏
  • 举报
回复
引用 4 楼 tntzbzc 的回复:

#准备测试数据

cat /home/hadoop/hemers.txt 
2014050201      新街口
2014050202      新街口
2014050203      新街口
2014050204      鼓楼
2014050205      岔路口
2014050206      岔路口
2014050207      新街口
2014050208      新街口

#创建测试数据表
CREATE EXTERNAL TABLE IF NOT EXISTS testdb.hemers(
 date STRING,
 ts STRING
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

#导入数据
LOAD DATA LOCAL INPATH '/home/hadoop/hemers.txt' OVERWRITE INTO TABLE testdb.hemers;

#执行SQL

use testdb;

select t1.date,t1.ts from hemers t1
  inner join(
   select dt,count(1)ct1,count(distinct ts)ct2 from (
     select unix_timestamp(date,'yyyyMMddhh') dt,date,ts from hemers a
     union all
     select unix_timestamp(date,'yyyyMMddhh')+3600 dt,date,ts from hemers b
   )c group by dt
   having count(1)=1 or ct2=2
)t2 on unix_timestamp(t1.date,'yyyyMMddhh') =t2.dt;


#输出

2014050201      新街口
2014050204      鼓楼
2014050205      岔路口
2014050207      新街口

如果你的数据不是按小时连续排列的,请用rownumber代替
经测试,没有达到预期的效果。
EA游戏真好玩 2014-05-28
  • 打赏
  • 举报
回复
天啊,好高深,还好我不是搞数据库的····
my03131302 2014-05-27
  • 打赏
  • 举报
回复
xwm0008 2014-05-27
  • 打赏
  • 举报
回复
学习了,谢谢分享
wahahahahahaha2 2014-05-24
  • 打赏
  • 举报
回复
sql语句能够和存储过程一样强大吗
同流合污c 2014-05-24
  • 打赏
  • 举报
回复
hive是什么呀
twtiqfn 2014-05-24
  • 打赏
  • 举报
回复
应该同有那么难吧
XingYunBenChen 2014-05-23
  • 打赏
  • 举报
回复
新手理解如下: 应该是取B变化之后的第一条记录。我的理解是只能用一个reduce, 我只想到用streaming, 例如 set mapred.reduce.tasks = 1; ADD FILE 'streaming script name'; FROM( FROM T SELECT A,B ORDER BY A) map_output USING 'streaming script name' AS A,B; 'streaming script name' -- 一条条的读 记下B 一旦改变 则输出 A,B 这只是我的理解还望指点~~
撸大湿 2014-05-23
  • 打赏
  • 举报
回复

#准备测试数据

cat /home/hadoop/hemers.txt
2014050201 新街口
2014050202 新街口
2014050203 新街口
2014050204 鼓楼
2014050205 岔路口
2014050206 岔路口
2014050207 新街口
2014050208 新街口

#创建测试数据表
CREATE EXTERNAL TABLE IF NOT EXISTS testdb.hemers(
date STRING,
ts STRING
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

#导入数据
LOAD DATA LOCAL INPATH '/home/hadoop/hemers.txt' OVERWRITE INTO TABLE testdb.hemers;

#执行SQL

use testdb;

select t1.date,t1.ts from hemers t1
inner join(
select dt,count(1)ct1,count(distinct ts)ct2 from (
select unix_timestamp(date,'yyyyMMddhh') dt,date,ts from hemers a
union all
select unix_timestamp(date,'yyyyMMddhh')+3600 dt,date,ts from hemers b
)c group by dt
having count(1)=1 or ct2=2
)t2 on unix_timestamp(t1.date,'yyyyMMddhh') =t2.dt;


#输出

2014050201 新街口
2014050204 鼓楼
2014050205 岔路口
2014050207 新街口



如果你的数据不是按小时连续排列的,请用rownumber代替
Hemers 2014-05-22
  • 打赏
  • 举报
回复
应该是这种算法的。你看看数据结果就知道了
  • 打赏
  • 举报
回复
分组取最小值?

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧