尝试使用我可以找到的JAR(不确定它们是否是最佳选择,我需要使用ESRI并在Hive中进行操作):
ADD JAR /home/user/lib/esri-geometry-api-1.2.1.jar;
ADD JAR /home/user/lib/spatial-sdk-hive-1.1.1-SNAPSHOT.jar;
ADD JAR /home/user/lib/esri-geometry-api.jar;
ADD JAR /home/user/lib/spatial-sdk-hadoop.jar;
CREATE TEMPORARY FUNCTION ST_Polygon AS 'com.esri.hadoop.hive.ST_Polygon';
CREATE TEMPORARY FUNCTION ST_Point AS 'com.esri.hadoop.hive.ST_Point';
CREATE TEMPORARY FUNCTION ST_Contains AS 'com.esri.hadoop.hive.ST_Contains';
CREATE TEMPORARY FUNCTION ST_Geometry AS 'com.esri.hadoop.hive.ST_Geometry';
运行以下查询:
SELECT
IF(1=1, 40.7484445, 0) AS latitude,
IF(1=1,-73.9878531, 0) AS longitude
FROM any_table
WHERE
NOT ST_Contains(
ST_POLYGON('POLYGON((170.0 20.0, -170.0 73.0, -50.0 20.0, -50.0 73.0))'),
ST_Point(CAST(longitude AS DOUBLE), CAST(latitude AS DOUBLE)))
LIMIT 1;
在多边形
'POLYGON((170.0 20.0, -170.0 73.0, -50.0 20.0, -50.0 73.0))'
大致为美国框的情况下,给定的坐标40.7484445,-73.9878531
属于纽约。结果在WHERE NOT中为空,但仍返回这些坐标。它没有按预期进行过滤。我做错了什么?
最佳答案
只能加载几何API的一个版本。同样,只有spaced-sdk-hadoop或一对spaced-sdk-json和spaced-sdk-hive中的一个。
WKT多边形的末端顶点重复起始顶点。
多边形需要按顶点顺序指定,而不是按锯齿形顺序排列。
几何API是平面的,将不支持在国际日期变更线周围进行环绕。
预期纬度为-170而不是+170。
wget https://github.com/Esri/spatial-framework-for-hadoop/releases/download/v1.1/spatial-sdk-hive-1.1.jar \
https://github.com/Esri/spatial-framework-for-hadoop/releases/download/v1.1/spatial-sdk-json-1.1.jar \
https://github.com/Esri/geometry-api-java/releases/download/v1.2.1/esri-geometry-api-1.2.1.jar
hive -S
添加jar /pathto/esri-geometry-api-1.2.1.jar
/pathto/spatial-sdk-json-1.1.jar
/pathto/spatial-sdk-hive-1.1.jar;
创建临时函数ST_AsBinary作为'com.esri.hadoop.hive.ST_AsBinary';
-...
选择ST_Contains(ST_Polygon(1,1,1,4,4,4,4,4,1),ST_Point(2,3));
真正
选择ST_Contains(ST_Polygon('POLYGON((1 1,1 4,4 4,4 1,1 1))'),ST_Point(2,3));
真正
选择ST_Contains(ST_POLYGON('POLYGON((-170.0 20.0,-170.0 73.0,-50.0 20.0,-50.0 73.0,-170.0 20.0))'),ST_Point(-73.9878531,40.7484445));
真正
选择不ST_Contains(ST_POLYGON('POLYGON((-170.0 20.0,-170.0 73.0,-50.0 20.0,-50.0 73.0,-170.0 20.0))'),ST_Point(-73.9878531,40.7484445));
假