Hive 上的非平等加入

Posted

技术标签:

【中文标题】Hive 上的非平等加入【英文标题】:Non Equality Join on Hive 【发布时间】:2014-11-13 09:30:41 【问题描述】:

我正在尝试在 hive 上模拟 SQL 查询,我从两个没有具有公共字段的表中获取数据。

这两个表是几何的(GeoHive),一个包含一堆点(每个记录一个),另一个包含一个网格(每个记录一个单元格)。目标是计算每个单元格内有多少点。

两个表之间的连接条件是几何函数本身。这就是我在 PostGIS 中的做法:

SELECT g.geom, count(t.geom) AS cnt
   FROM grid g, points t
WHERE st_contains(g.geom,t.geom) GROUP BY g.geom

Hive 不接受多选,所以我必须执行连接。我认为这样的事情可以工作:

SELECT count(1) FROM grid JOIN points WHERE   
 ST_Contains(grid.geom,points.geom) GROUP BY grid.geom;

,但是配置单元 silently ignores my condition:

“Hive 不支持非相等条件的连接条件,因为很难将此类条件表达为 map/reduce 作业”

有人对如何在 Hive 上重构此类查询有任何想法吗?

【问题讨论】:

您尝试过交叉连接吗?将 st_contains 转换为等式是否容易? 感谢您的回复:事实上,过去四个小时我一直在尝试交叉连接,但还没有任何结果.... SELECT count(geom) FROM grid_bcn CROSS JOIN geo_tweets WHERE ST_Contains( grid_bcn.geom,geo_tweets.location) GROUP BY grid_bcn.geom limit 10; 将 ST_CONTAIS 转换为等式是一个很好的提示...... 【参考方案1】:

我将回答我自己的问题,以说明我的查询尝试是正确的:它因其他原因而失败,与语法无关。

SELECT count(grid.geom) as ptcnt FROM grid JOIN points WHERE
ST_Contains(grid.geom,points.geom) GROUP BY grid.geom;

这其实相当于写:

SELECT count(grid.geom) as ptcnt FROM grid JOIN points ON(TRUE) WHERE
ST_Contains(grid.geom,points.geom) GROUP BY grid.geom;

Hive 实际上不支持非等式连接,因此我将连接条件设置为“TRUE”,并在“WHERE”子句中过滤我的结果。

显然这是空间连接的标准行为,您可以阅读here。

【讨论】:

以上是关于Hive 上的非平等加入的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 hive 中的电话号码前缀加入 hive 表

Hive 在条件之间加入

Hive 支持 Nonequi 加入?

使用 Hive/Hadoop 加入两个排序的文件

Hive:如何加入日期之间的条件?

Theta 加入 Hive