我正在尝试使用hadoopgis框架,以便为hive添加空间支持。我想做的事情之一是从外部数据(从postgis)创建一个空间表。不幸的是,esri提供的序列化程序Map到esri json格式,而不是wkt、geojson等标准。我最后所做的,只是一个解决办法。
首先,将postgis数据导出为一个tab分隔的文件,将几何字段转换为geojson。
\COPY (select id, ST_AsGeoJSON(geom) from grid_10) TO '/tmp/grid_10.geojson';
然后我把它放在s3文件系统的某个地方,并使用csv序列化程序加载它。它创建了一个包含两个字段的表:and integer和text(包含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创建一个几何体并将其写入一个表——得到了同样的结果。这是虫子吗?这是不是意味着,我注定要使用动态转换来执行空间查询,顺便问一下,从计算Angular 来说,它不是比处理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;
我想知道是否有人经历过同样的问题。
更新:这个问题发生在运行amazonhadoop发行版3.3.1的hive0.11上。我还从这个链接中提取了esri罐:
https://github.com/esri/gis-tools-for-hadoop/archive/master.zip
当我切换到jar2.0和最新的hive(0.13)时,问题消失了。
你可以在这里找到我的问题报告。希望这能帮助遇到同样问题的人。
1条答案
按热度按时间2wnc66cl1#
我也经历了你上面描述的问题…我从某个Maven那里得到的解决方案是用wkt存储你的几何信息,即文本格式,而不是你尝试过的几何格式。