hive和presto一些好用的自定义udf函数

萧升
2023-12-01

自己编写了一些hive和presto的udf函数,最近在github上开源了(可以查看hive-third-functionspresto-third-functions)。有需要的人可以直接下来用,项目README中有详细的用法说明。如果有好的建议或发现了bug,可以在issue提问题。也欢迎加入自己的udf,完善这个第三方函数库。

一、hive-third-functions中包含的函数

可以参考项目说明中的示例来理解这些函数。

1. 字符串函数

函数描述
pinyin(string) -> string将汉字转换为拼音
md5(string) -> stringmd5 哈西函数
sha256(string) -> stringsha256 哈西函数

2. 数组函数

函数描述
array_contains(array<E>, E) -> boolean判断元素是否在array中.
array_intersect(array, array) -> array返回两个array的交集.
array_max(array<E>) -> E返回array中的元素最大值.
array_min(array<E>) -> E返回array中的元素最小值.
array_join(array, delimiter, null_replacement) -> string使用delimiter指定的值来连接array中的元素,null_replacement是可选项,用来替代null,返回string.
array_distinct(array) -> array移除array中的重复元素
array_position(array<E>, E) -> long返回array中指定值第一次出现的位置,初始值为1,如果没找到返回0.
array_remove(array<E>, E) -> array移除array中所有指定的值.
array_reverse(array) -> array翻转array的元素.
array_sort(array) -> array对array中的元素进行排序,array中的元素必须是可排序的.
array_concat(array, array) -> array连接两个array.
array_value_count(array<E>, E) -> long统计array中指定元素出现的次数.
array_slice(array, start, length) -> array求array的子数组。从start开始,截取length个。如果start为负值,则从元素末尾开始。如-1表示从最后一个元素开始。
array_element_at(array<E>, index) -> E返回array中第index个位置的元素,如果index为负值,则从数组最后开始。例如-1表示最后一个元素.

3. map函数

函数描述
map_build(x<K>, y<V>) -> map<K, V>根据指定的key/value数组来创建map.
map_concat(x<K, V>, y<K, V>) -> map<K,V>连接两个map,如果一个key在 xy 中都出现了,那合并后的map中该key的值是其在y 中的值.
map_element_at(map<K, V>, key) -> V返回给定key 的值,如果不存在,返回NULL.
map_equals(x<K, V>, y<K, V>) -> boolean判断两个map是否相等.

4. 日期函数

函数描述
day_of_week(date_string | date) -> int一周的第几天,星期一返回1,星期二返回2,依此类推。
day_of_year(date_string | date) -> int一年的第几天.
zodiac_en(date_string | date) -> string将日期转换为星座英文
zodiac_cn(date_string | date) -> string将日期转换为星座中文
type_of_day(date_string | date) -> string获取日期的类型(1: 法定节假日, 2: 正常周末, 3: 正常工作日 4:攒假的工作日),错误返回-1.

5. json函数

函数描述
json_array_get(json, jsonPath) -> array(varchar)returns the element at the specified index into the json_array. The index is zero-based.
json_array_length(json, jsonPath) -> array(varchar)returns the array length of json (a string containing a JSON array).
json_array_extract(json, jsonPath) -> array(varchar)extract json array by given jsonPath.
json_array_extract_scalar(json, jsonPath) -> array(varchar)like json_array_extract, but returns the result value as a string (as opposed to being encoded as JSON).
json_extract(json, jsonPath) -> array(varchar)extract json by given jsonPath.
json_extract_scalar(json, jsonPath) -> array(varchar)like json_extract, but returns the result value as a string (as opposed to being encoded as JSON).
json_size(json, jsonPath) -> array(varchar)like json_extract, but returns the size of the value. For objects or arrays, the size is the number of members, and the size of a scalar value is zero.

6. bitwise函数

函数描述
bit_count(x, bits) -> bigintcount the number of bits set in x (treated as bits-bit signed integer) in 2’s complement representation
bitwise_and(x, y) -> bigintreturns the bitwise AND of x and y in 2’s complement arithmetic.
bitwise_not(x) -> bigintreturns the bitwise NOT of x in 2’s complement arithmetic.
bitwise_or(x, y) -> bigintreturns the bitwise OR of x and y in 2’s complement arithmetic.
bitwise_xor(x, y) -> bigintreturns the bitwise XOR of x and y in 2’s complement arithmetic.

7. 身份证函数

函数描述
id_card_province(string) -> string获取省份
id_card_city(string) -> string获取城市
id_card_area(string) -> string获取区或县
id_card_birthday(string) -> string获取出生日期
id_card_gender(string) -> string获取性别
is_valid_id_card(string) -> boolean鉴定是否是有效的身份证号码.
id_card_info(string) -> json获取上述所有信息,结果为json.

8. 坐标相关函数

函数说明
wgs_distance(double lat1, double lng1, double lat2, double lng2) -> double计算WGS84坐标系下的坐标距离,单位为米
gcj_to_bd(double,double) -> json火星坐标系(GCJ-02)转百度坐标系(BD-09),谷歌、高德——>百度
bd_to_gcj(double,double) -> json百度坐标系(BD-09)转火星坐标系(GCJ-02),百度——>谷歌、高德
wgs_to_gcj(double,double) -> jsonWGS84转GCJ02(火星坐标系)
gcj_to_wgs(double,double) -> jsonGCJ02(火星坐标系)转GPS84,输出的WGS-84坐标精度为1米到2米之间。
gcj_extract_wgs(double,double) -> jsonGCJ02(火星坐标系)转GPS84,输出的WGS-84坐标精度为0.5米内。但是计算速度慢于gcj_to_wgs

二、presto-third-functions中包含的函数

1. 字符串相关函数

函数说明
pinyin(string) -> string将汉字转为拼音
md5(string) -> string对字符串求md5值
sha256(string) -> string对字符串求sha256值

2. 日期相关函数

函数说明
dayofweek(date_string | date) -> int计算给定日期是每周7天内的第几天,其中周一返回1,周天返回7,错误返回-1.
zodiac(date_string | date) -> string将日期转换为星座英文
zodiac_cn(date_string | date) -> string将日期转换为星座中文
typeofdate(date_string | date) -> string获取日期的类型(1: 法定节假日, 2: 正常周末, 3: 正常工作日 4:攒假的工作日),错误返回-1.

3. 数组相关函数

函数说明
array_union(array, array) -> array求两个array的并集
value_count(array(T), T value) -> int统计在数组中值为给定值的元素个数

4. JSON相关函数

函数说明
json_array_extract(json, jsonPath) -> array(varchar)提取json数组中对应路径的值
json_array_extract_scalar(json, jsonPath) -> array(varchar)json_array_extract类似,但是返回结果是string(不是json格式)

5. MAP相关函数

函数说明
value_count(MAP(K,V), V value) -> int统计中MAP中值为给定值的元素的个数

6. 身份证相关函数

函数说明
id_card_province(string) -> string由身份证号获取省份
id_card_city(string) -> string由身份证号获取城市
id_card_area(string) -> string由身份证号获取区或县
id_card_birthday(string) -> string由身份证号获取出生日期
id_card_gender(string) -> string由身份证号获取性别
is_valid_id_card(string) -> boolean鉴别是否是有效的身份证号
id_card_info(string) -> json获取身份证号对应的信息,包括省份,城市,区县,性别及是否有效

7. 坐标相关函数

函数说明
wgs_distance(double lat1, double lng1, double lat2, double lng2) -> double计算WGS84坐标系下的坐标距离,单位为米
gcj_to_bd(double,double) -> json火星坐标系(GCJ-02)转百度坐标系(BD-09),谷歌、高德——>百度
bd_to_gcj(double,double) -> json百度坐标系(BD-09)转火星坐标系(GCJ-02),百度——>谷歌、高德
wgs_to_gcj(double,double) -> jsonWGS84转GCJ02(火星坐标系)
gcj_to_wgs(double,double) -> jsonGCJ02(火星坐标系)转GPS84,输出的WGS-84坐标精度为1米到2米之间。
gcj_extract_wgs(double,double) -> jsonGCJ02(火星坐标系)转GPS84,输出的WGS-84坐标精度为0.5米内。但是计算速度慢于gcj_to_wgs
 类似资料: