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 上的非平等加入的主要内容,如果未能解决你的问题,请参考以下文章