On this page
Overview
Hadoop-GIS 是一个可扩展的高性能空间数据仓库系统,用于在 Hadoop 上运行大规模空间查询。 Hadoop-GIS 依赖 RESQUE 进行空间查询处理。 RESQUE 是内部开发的基于图块的空间查询引擎,该引擎用 C 语言编写并部署为共享库。
Hive SP :我们将 Hadoop-GIS 与 Hive 集成在一起,以通过统一的查询语言(HQL)和界面(Hive Shell)支持结构化查询和空间查询。
Query Language
在语言层,Hadoop-GIS 扩展了 HQL 以支持空间数据类型和查询构造。
JOIN 运算符–我们保留 JOIN 关键字是为了向后兼容。但是,只要连接谓词中存在空间运算符,该查询就被视为空间连接查询,并且空间连接查询处理管道将应用于处理该查询。
例如 SELECT * FROM ST_INTERSECTS 上的 JOIN b(a.spatialcolumn,b.spatialcolumn)= TRUE;
Data Type
我们将在 Hive 中添加空间数据类型: GEOMETRY 。几何是 String 类型的扩展,具有特殊的序列化/反序列化和操作支持。例如,用户可以创建一个带有空间列的表,如以下示例所示:
如果不存在空间表,则创建表(tile_id STRING,d_id STRING,rec_id STRING,大纲 GEOMETRY )以' t'终止的行格式分隔字段;
Query Pipelines
我们已经在 Hive 和 RESQUE 之间创建了有效的查询管道,以支持各种空间查询。同样,以“对 Hive 进行最小更改”的 IDEA,当前的查询管道实现为一组“自定义 MapReduce 代码”,并通过 TRANSFORM 机制与 Hive 进行交互。
具体来说,空间 SQL 查询将在“查询翻译”阶段被拦截,以将查询转换为 Hive 可执行查询运算符。基本上,空间查询处理部分将转换为一组自定义 Map 和 Reduce 脚本,这些脚本将通过 STDIN 和 STDOUT 与 Hive 进行交互。
在 Hive 将空间查询运算符提交给 RESQUE 进行处理之前,它将使用适当的序列化方法将数据转换为 RESQUE 可以识别的格式。然后,在进行 REQUE 处理之后,RESQUE 会将数据进行灭菌处理,使其成为 Hive 可以识别的格式。
Spatial Predicates
目前,Hadoop-GIS 支持以下实现为 Hive UDF 的空间谓词。更多的谓词正在开发中,并将在将来集成。
st_intersects
st_touches
st_crosses
st_contains
st_adjacent
st_disjoint
st_equals
st_dwithin
st_within
st_overlaps
我们可以像在 Hive shell 中使用标准 HQL 一样使用空间查询。例如,如果我们要“空间地联接”两个表(例如* ta 和 tb *),则可以在 Hive Shell 中发出以下 HQL 语句:
- *从 ta JOIN tb ON 中选择 ta.rec_id,tb.rec_id(st_intersects(ta.outline,tb.outline)= TRUE); *
对于上面的* st_intersects *查询,我们将获得以下输出:
……
*阶段 1 的 Hadoop 作业信息:Map 器数量:2;减速器数量:1 *
-
- 2013-09-08 01:23:18,838 第 1 阶段 Map= 0%,减少= 0%*
-
- 2013-09-08 01:23:24,889 第 1 阶段 Map= 100%,减少= 0%*
-
- 2013-09-08 01:23:33,954 第 1 阶段 Map= 100%,减少= 100%*
*结束的工作= job_201309080121_0001 *
启动了 MapReduce 作业:
作业 0:Map:2 减少:1 HDFS 读取:187984 HDFS 写入:40 成功
-
- MapReduce 总花费的 CPU 时间:0 毫秒*
OK
1 1
1 2
1 3
1 4
15 87
34 78
54 74
61 54
花费时间:28.207 秒
Hive 的更改
我们试图对 Hive 进行最小的更改,以不损害兼容性。
更改主要在语言和查询优化层进行。
Lanague 层 :Hive.g 已更改为添加数据类型和其他空间语言支持。
解析/分析: 大部分* SemanticAnalyzer *被更改(通过添加函数)以生成可执行的查询计划。
优化 :使用可以根据空间谓词和表信息生成最佳查询计划的功能对生成的查询计划进行优化。
RESQUE 库将作为共享库部署,并将提供此库的路径以供配置单元通过 RANSFORM 机制调用该库中的函数。