UDF2
问题
- 根据给定的gps点point(x,y)和北京的shape数据,关联出 AOI ID
IO
- 输入
- gps点表
create table gps ( x double, //经度 y double //纬度 )
+------------+------------+
| x | y |
+------------+------------+
| 113.570517 | 22.149751 |
| 113.57431 | 22.152167 |
| 113.544971 | 22.190477 |
| 113.546035 | 22.203194 |
| 113.568557 | 22.168465 |- shape文件
ogrinfo -ro -al beijing_20160122152124568.shp OGRFeature(beijing_20160122152124568): AOIID (String) = G00AOI000001ZIQ3 POIID (String) = B0FFFTLAU4 Name (String) = ˮѧԺԺ Type (String) = Disp_Class (Integer) = Reference (String) = (null) ParentID (String) = (null) CenterX (Real) = 116.322184 CenterY (Real) = 39.931526 Area (Real) = 19187.288500 CreateTime (String) = -- : UpdateTime (String) = -- : Update (String) = u CityName (String) = Memo (String) = POLYGON ((418756.3848 143755.6608,418756.5396 143755.7688,418759.47 143755.7688,418760.8884 143755.7616,418760.8884 143754.616799999989,418761.9324 143754.5628,418763.556 143754.5376,418763.624399999972 143753.8716,418763.9304 143753.810399999988,418763.898 143751.5064,418756.395599999989 143751.733199999988,418756.395599999989 143753.263199999987,418756.3848 143755.6608))
- 输出
- 根据gps表中点,判断是否内含与shape文件的polygon中,关联出AOIID
- 输出表
+------------+------------+--------+ | x | y | aoi_id | +------------+------------+--------+ | 419217.2568 | 143807.9436 | NULL | | 418659.14879999997 | 143630.046 | NULL | | 418659.6312 | 143629.9848 | NULL | | 418024.2636 | 143054.75519999999 | NULL | | 419875.88399999996 | 143947.60199999998 | NULL | | 418042.9692 | 143037.2556 | NULL | | 418469.9436 | 144192.348 | NULL | | 418469.9436 | 144192.348 | G00AOI000001WBC2 | | 420292.3248 | 143810.84879999998 | NULL | | 418509.26279999997 | 143762.994 | NULL |
知识点
- GDAL/ogr2ogr使用
- JTS geometry内含判断
- JTS Rtree使用
数据准备
- shape文件
- 提取wkt和aoiid字段
ogr2ogr -lco "GEOMETRY=AS_WKT" -lco "SEPARATOR=SEMICOLON" -f CSV beijing_20160122152124568.csv -sql "select AOIID from beijing_20160122152124568" beijing_20160122152124568.shp
- 去掉文件中的双引号
sed -e '/"/s/"//g' beijing_20160122152124568.csv > beijing.csv
- odps中创建表
create table beijing(wkt string,lua_id bigint);
- 上传文件
tunnel u -fd ';' beijing.csv.csv autonavi_tinfo_dev.exercise_land_user_area; //列之间按照";"分割
- 将表作为资源文件加入odps
add table beijing
编码
- udtf
import java.util.Iterator; import java.util.List; import com.aliyun.odps.udf.ExecutionContext; import com.aliyun.odps.udf.UDFException; import com.aliyun.odps.udf.UDTF; import com.aliyun.odps.udf.annotation.Resolve; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.index.strtree.STRtree; import com.vividsolutions.jts.io.WKTReader; /** * 加载table中的资源,字段如: wkt string ,bigint lua_id 参数: x,y,tableName,idxWkt,idxId * * @author xingxing.dxx double,double,string,bigint,bigint->double,double,string * */ @Resolve({ "double,double->double,double,string" }) public class ExerciseWithinUDTF extends UDTF { /* * private Logger LOGGER = * LoggerFactory.getLogger(ExerciseWithinUDTF.class); */ private GeometryFactory geometryFactory = new GeometryFactory(); private WKTReader reader = new WKTReader(geometryFactory); private STRtree strtree; private ExecutionContext ctx; public void setup(ExecutionContext ctx) throws UDFException { this.ctx = ctx; } @Override public void process(Object[] args) throws UDFException { final double x = (double) args[0]; final double y = (double) args[1]; String tableName = (String) args[2]; int idxWkt = ((Long) args[3]).intValue(); int idxId = ((Long) args[4]).intValue(); // 1.初始化,第一次才加载表资源 if (strtree == null) { strtree = new STRtree(); try { Iterator<Object[]> iterator = this.ctx.readResourceTable(tableName).iterator(); while (iterator.hasNext()) { Object[] o = iterator.next(); String wkt = (String) o[idxWkt]; String id = (String) o[idxId]; Polygon polygon = (Polygon) reader.read(wkt); GeometryBean gb = new GeometryBean(polygon, id); strtree.insert(polygon.getEnvelopeInternal(), gb); } } catch (Exception e) { /* LOGGER.error("资源加载出现问题",e); */ e.printStackTrace(); throw new RuntimeException(e.getMessage()); } } Coordinate coord = new Coordinate(x, y); Point point = geometryFactory.createPoint(coord); Envelope envelope = new Envelope(coord); List<GeometryBean> items = strtree.query(envelope); String luaId = null; if (items != null && items.size() > 0) { for (Object o : items) { GeometryBean geometryBean = (GeometryBean) o; if (point.within(geometryBean.getPolygon())) { luaId = geometryBean.getId(); } forward(x, y, luaId); } } else { forward(x, y, luaId); } } public void close() throws UDFException { } }- sql
CREATE TABLE result_gps_within AS SELECT udtf_exercise_within(x,y,,) as(x,y,aoi_id) FROM gpsSELECT a.aoi_id,count(distinct x,y) num FROM ( SELECT udtf_exercise_within(x*,y*,,) as(x,y,aoi_id) FROM gps ) a where aoi_id is not null GROUP BY a.aoi_id
碰到的坑
- shape文件是秒的格式,需要转换成度
- ogr2ogr转成的csv文件需要去掉双引号,否则不能反序列化为polygon
- udtf读取资源文件需要把表当做资源添加
UDF2的更多相关文章
- DB2 嵌入式应用中定义游标(开放平台上)
DECLARE CURSOR statement The DECLARE CURSOR statement defines a cursor. Invocation Although an inter ...
- AnonymousType匿名类型和对象之间的转换
本文转载:http://www.cnblogs.com/dean-Wei/p/3150553.html 一.匿名对象转换为对象. 1.问题: 2.解决方案:强制指定类型. 解决之. 二. 对象转换为匿 ...
- mysql常用的提权方法
一,利用MOF提权 Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件: 方法 1: 运行 MOF 文件指定为命令行参数将 Mofcomp. ...
- 【Spark篇】---SparkSql之UDF函数和UDAF函数
一.前述 SparkSql中自定义函数包括UDF和UDAF UDF:一进一出 UDAF:多进一出 (联想Sum函数) 二.UDF函数 UDF:用户自定义函数,user defined functio ...
- Spark SQL UDF示例
UDF即用户自定函数,注册之后,在sql语句中使用. 基于scala-sdk-2.10.7,Spark2.0.0. package UDF_UDAF import java.util import o ...
- 【Spark篇】---SparkSQL中自定义UDF和UDAF,开窗函数的应用
一.前述 SparkSQL中的UDF相当于是1进1出,UDAF相当于是多进一出,类似于聚合函数. 开窗函数一般分组取topn时常用. 二.UDF和UDAF函数 1.UDF函数 java代码: Spar ...
- 【Spark-SQL学习之三】 UDF、UDAF、开窗函数
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- Windows XP UDF 2.5 补丁,播放蓝光ISO光盘必备
蓝光光盘的文件系统是UDF2.5,Windows XP及以下的操作系统默认不能支持这个文件系统.当我们在XP系统中使用蓝光光盘或蓝光ISO文件时,就会提示“Windows不能从此盘读取,此盘可能已损坏 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十五)Spark编写UDF、UDAF、Agg函数
Spark Sql提供了丰富的内置函数让开发者来使用,但实际开发业务场景可能很复杂,内置函数不能够满足业务需求,因此spark sql提供了可扩展的内置函数. UDF:是普通函数,输入一个或多个参数, ...
随机推荐
- 二十四、【开源】EFW框架Winform前端开发之项目结构说明和调试方法
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...
- WPA字典锦集
1.xiemimendictionary 字典下载(第二季),500W整理过后还有282W条不重复的密码 字典下载,600W整理过后还有400W条不重复的密码 历次泄+常用弱口令字典集合[无中文去重复 ...
- ODB学习笔记之基础环境搭建
一,简介 ODB是应用于C++的一个开源.跨平台.跨数据库的对象关系映射(ORM)系统. 它可以让你持久化C++对象到关系数据库,而不必处理表.列或者SQL,无需手动编写任何映射代码. ODB支持 ...
- Knockout 新版应用开发教程之Observable Arrays
假如你想到侦测和相应一个对象的改变,假如你想要侦测和响应一一组合集的改变,就要用observableArray 在许多场景都是很有用的,比如你要在UI上需要显示/编辑的一个列表数据集合,然后对集合进行 ...
- thread_Exchanger数据交换
Exchanger 是一个同步辅助类,用于两个并发线程之间在一个同步点进行数据交换. 允许两个线程在某一个点进行数据交换. 可以视作双向的同步队列: 可应用于基因算法.流水线设计等场景 Exchan ...
- Android --- 斗地主 [牌桌实现源码]
1.主Activity <span style="font-size:18px;color:#3333ff;">package com.bison; import an ...
- OnMeasureItem和OnDrawItem的区别和联系
我们在做程序设计时界面与功能,那个更加吸引用户的兴趣呢?这是一个很难回答的问题.拥有美丽的外观,软件就成功了一半.界面由控件.工具栏.菜单.窗体等元素组成,对他们进行美化就能得到一个美丽的界面. 目前 ...
- web api返回格式小结
web api返回格式小结: 1.默认是返回xml格式数据,如果需要返回json格式,需要在Global.asax中加入: GlobalConfiguration.Configuration.Form ...
- 很有趣的Java分形绘制
部分与整体以某种形式相似的形,称为分形. 首先我们举个例子: 我们可以看到西兰花一小簇是整个花簇的一个分支,而在不同尺度下它们具有自相似的外形.换句话说,较小的分支通过放大适当的比例后可 ...
- Java集合Iterator迭代器的实现
一.迭代器概述 1.什么是迭代器? 在Java中,有很多的数据容器,对于这些的操作有很多的共性.Java采用了迭代器来为各种容器提供了公共的操作接口.这样使得对容器的遍历操作与其具体的底层实现相隔离, ...