【发布时间】:2014-11-26 10:54:53
【问题描述】:
我正在尝试使用Hadoop GIS Framework,以便为 hive 添加空间支持。 我想做的一件事是从外部数据(来自 PostGIS)创建一个空间表。 不幸的是,ESRI 提供的serializer 映射为 ESRI JSON 格式,而不是 WKT、GeoJSON 等标准。我最终做的是一个解决方法。
第一件事是将我的 PostGIS 数据导出为制表符分隔文件,将几何字段转换为 GeoJSON。
\COPY (select id, ST_AsGeoJSON(geom) from grid_10) TO '/tmp/grid_10.geojson';
然后我把它放在 S3 文件系统的某个地方,并使用 csv 序列化程序加载它。它创建了一个包含两个字段的表:整数和文本(包含 GeoJSON)。
CREATE EXTERNAL TABLE grid_10 (id bigint, json STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION 's3://some-url/data/grids/geojson';
我可以使用这个查询从这个 GeoJSON 正确地生成几何图形:
SELECT ID, ST_AsText(ST_GeomFromGeoJSON(json)) from grid_10 limit 3;
哪些输出:
现在我想将此表转换为实际空间表,其中几何图形存储为 BLOB,而不是一些文本。我通过以下查询做到了:
create table new_grid as SELECT ID, ST_GeomFromGeoJSON(json) as geom from grid_10;
令我惊讶的是,这张表的内容是相同的几何图形,一遍又一遍地重复。
我尝试了相同的方法 - 从 WKT/GeoJSON 创建几何并将其写入表格 - 结果相同。这是一个错误吗?这是否意味着,我注定要使用即时转换来执行空间查询,顺便说一句,这在计算方面不是比操作 BLOB 成本高吗?
create table grid_cnt as
SELECT grid_10.id, count(grid_10.id) as ptcnt FROM grid_10 JOIN tweets WHERE ST_Contains(ST_GeomFromGeoJSON(grid_10.json),ST_Point(tweets.longitude, tweets.latitude))=true GROUP BY grid_10.id;
我想知道是否有人遇到过同样的问题。
更新: 这个问题发生在 Hive 0.11 上,在 Amazon Hadoop 的 Distribution 3.3.1 上运行。我还从这个链接中提取了 ESRI 罐子:
https://github.com/Esri/gis-tools-for-hadoop/archive/master.zip
当我切换到jar 2.0,和最新的hive(0.13)时,问题就消失了。
你可以找到我的问题报告here。希望这可以帮助遇到同样问题的人。
【问题讨论】:
标签: hadoop geometry hive gis spatial-query