【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

相关文章

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.