【Maxcompute】数据封装json、根据经纬度计算距离、根据证件号提取年龄段信息、判断是否在外包多边形内udf、udtf函数

本文主要是介绍【Maxcompute】数据封装json、根据经纬度计算距离、根据证件号提取年龄段信息、判断是否在外包多边形内udf、udtf函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.梳理、总结经纬度处理在Maxcompute平台上的实战应用,如模型结果等封装json格式、根据经纬度计算距离udf、根据证件号提取年龄段信息、判断是否在外包多边形内udf、udtf、函数注册与使用。
2.欢迎批评指正,跪谢一键三连!

文章目录

    • 1.参考代码
      • 1.1 模型结果等封装`json`格式`udf`函数
      • 1.2 根据经纬度计算距离`udf`函数
      • 1.3 根据证件号提取年龄段信息`udtf`函数
      • 1.4 判断是否在外包多边形内`udf`函数

1.参考代码

1.1 模型结果等封装json格式udf函数

  • format_all_cols_json_youli,可变参数
    #coding:utf-8import json
    # import sys
    from odps.udf import annotate@annotate("*->string")
    class format_all_cols_json_youli(object):def evaluate(self, *eles):p_dic,keys,dic_keys,result = {},[],[],''if eles is not None and len(eles)>1:keys = eles[-2].split(',')dic_keys = eles[-1].split(',')inx = 0for ky in keys:if ky in dic_keys:# if eles[inx] is not None:# try:p_dic[ky] = eval(eles[inx]) if eles[inx] is not None else []# except Exception as e:#     print(eles[inx],p_dic[ky], eles)#     raise# else:#     p_dic[ky] = else:p_dic[ky] = eles[inx]inx+=1# result = json.dumps(p_dic, sort_keys=True, indent=True)# result = json.dumps(p_dic)result = json.dumps(p_dic, sort_keys=True, indent=True, ensure_ascii=False)return result
    

1.2 根据经纬度计算距离udf函数

  • lnglat_distance_youli
    #coding:utf-8
    #lnglat_distance_youli.pyfrom odps.udf import annotate
    from math import sin,cos,radians,fabs,sqrt,asin'''
    function: 根据经纬度计算距离,单位m
    input:  lng1,lat1,lng2,lat2
    parms:  lng1:点1经度 doublelat1:点1纬度 doublelng2:点2经度 doublelat2:点2纬度 double
    output:distance: 距离,单位m
    '''
    @annotate("double,double,double,double->double")
    class lnglat_distance_youli(object):def evaluate(self,lng1,lat1,lng2,lat2):ER=6378245hav=lambda x:sin(x/2)*sin(x/2)lng11=radians(float(lng1))lat11=radians(float(lat1))lng22=radians(float(lng2))lat22=radians(float(lat2))dlng=fabs(lng11-lng22)dlat=fabs(lat11-lat22)h=hav(dlat)+cos(lat11)*cos(lat22)*hav(dlng)distance=2 * ER * asin(sqrt(h))return distance
    

1.3 根据证件号提取年龄段信息udtf函数

  • age_info_extract_youli

    #coding:utf-8
    #info_extract.pyfrom odps.udf import annotate
    from odps.udf import BaseUDTF
    from odps.distcache import get_cache_table
    @annotate('string->string,string,string')
    class age_info_extract_youli(BaseUDTF):def __init__ (self):self.data = []self.age_num = [0,0,0,0,0] #ageRange : [0,18,35,60]self.age_range = ['18岁以下','19~35岁','36~60岁','60岁以上','数据缺失']def process(self, arg):if arg is not None and arg <> '':age = 2024 - int(arg[6:10])if age <= 18:self.age_num[0] += 1age_tag = 0elif age <=35 and age >18:self.age_num[1] += 1age_tag = 1elif age <= 60 and age >35:self.age_num[2] += 1age_tag = 2else:self.age_num[3] += 1age_tag = 3else :self .age_num[4] += 1age_tag = 4age = '缺失'self.data.append([age,age_tag])def close(self):for i in self.data:age = str(i[0]) tag_index = i[1]ageRange = self.age_range[tag_index]agePrecent = round(float(self.age_num[tag_index])/float(len(self.data)),2)self.forward(age,ageRange,str(agePrecent))
    

1.4 判断是否在外包多边形内udf函数

  • isin_xquyu_youli
    # coding: utf-8
    # 判断是否在外包多边形内,不在,返回0;在,返回1from odps.udf import annotate
    @annotate("string,string->bigint")
    class isin_xquyu_youli(object):# 替换区域边界经纬度点位数组huzbj_lis = [[119.920013, 31.170916], ... ]def evaluate(self, lng, lat):lat2, lng2 = float(lat), float(lng)lnglist = []latlist = []for i in range(len(isin_xquyu_youli.huzbj_lis)-1):lnglist.append(isin_xquyu_youli.huzbj_lis[i][0])latlist.append(isin_xquyu_youli.huzbj_lis[i][1])maxlng,minlng = max(lnglist),min(lnglist)maxlat,minlat = max(latlist),min(latlist)if (lng2 > maxlng or lng2 < minlng or lat2 > maxlat or lat2 < minlat):return 0# return '0, 111,%s,%s,%s,%s' % (str(maxlng),str(minlng),str(maxlat),str(minlat))cnt = 0point1 = isin_xquyu_youli.huzbj_lis[0]for i in range(1, len(isin_xquyu_youli.huzbj_lis)):point2 = isin_xquyu_youli.huzbj_lis[i]# 点与多边形顶点重合if (lat2 == point1[0] and lng2 == point1[1]) or (lat2 == point2[0] and lng2 == point2[1]):return 0# return '0, 112'# 判断线段两端点是否在射线两侧 不在肯定不相交 射线(-∞,lat)(lng,lat)if (point1[1] < lng2 and point2[1] >= lng2) or (point1[1] >= lng2 and point2[1] < lng2):# 求线段与射线交点 再和lat比较point12lng = point2[0] - (point2[1] - lng2) * (point2[0] - point1[0])/(point2[1] - point1[1])# 点在多边形边上if (point12lng == lat2):return 0# return '0, 113'if (point12lng < lat2):cnt += 1point1 = point2# 从这个点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外if cnt%2 == 0:return 0# return '0, 114'return 1
    

这篇关于【Maxcompute】数据封装json、根据经纬度计算距离、根据证件号提取年龄段信息、判断是否在外包多边形内udf、udtf函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032536

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam