本文主要是介绍【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函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!