中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

當前位置: 首頁 / 技術干貨 / 正文
Python實現Hive的UDF函數

2023-02-23

   scores

Python實現Hive的UDF函數

  Python實現UDF函數的邏輯

  Hive中使用Python自定義函數的時候,其實是一個重定向輸入的過程。將表中的指定的列逐行讀取,我們在Python的腳本中就可以依次對每一行的數據進行處理。

  import sys

  # sys.stdin: 標準輸入流,我們使用的input()函數,其實就是stdin的一個方法。

  # hive執行自定義函數的時候,會逐行讀取指定列的內容,我們就可以使用循環依次處理讀取到的每一行的數據。

  for line in sys.stdin:

  # 讀取到的這一行的數據,其中包含了若干個列,列于列之間以\t進行分隔

  # 切割出來每一個列

  columns = line.strip().split('\t')

  # 對列進行處理

  # 處理之后的結果,使用print直接打印即可

  # 如果需要返回多個列,多個列之間需要使用\t進行分隔

  print('hello world')

  在使用UDF的時候,需要按照如下的步驟

  # 1. 加載腳本文件

  add file <腳本文件>

  # 2. 執行腳本,執行Python的UDF函數的時候,只能使用transform函數

  select transform(<字段>) using 'python3 <腳本文件>' as (<字段列表>) from <表>

  自定義UDF函數案例

  案例一:將字母轉成全部大寫

# 1. 準備數據文件
zhangsan,male,19
lisi,female,20
wangwu,male,18
zhaoliu,female,19

# 2. 創建數據表
create table if not exists example_01(
t_name string,
t_gender string,
t_age int
)
row format delimited
fields terminated by ',';

  需求:將所有的列都轉成大寫

# -*- coding: utf-8 -*-
# @Author : 大數據章魚哥
# @Company : 北京千鋒互聯科技有限公司

# string_upper.py
import sys

for line in sys.stdin:
print(line.upper(), end='')

-- 應用UDF
add file string_upper.py

-- 查詢名字,將其轉成大寫
select transform(t_name) using 'python3 string_upper.py' as (t_name) from example_01;
-- 查詢名字、性別,將其轉成大寫
select transform(t_name, t_gender) using 'python3 string_upper.py' as (t_name, t_gender) from example_01;

  需求:只需要將姓名轉成大寫

# -*- coding: utf-8 -*-
# @Author : 大數據章魚哥
# @Company : 北京千鋒互聯科技有限公司

# string_name_upper.py
import sys

for line in sys.stdin:
# 1. 切割出來每一列
columns = line.strip().split('\t')
# 2. 判斷切割出來的列的數量,如果數量不正確,這一行數據不處理
length = len(columns)
name = columns[0].upper() if length >= 1 else 'NULL'
gender = columns[1] if length >= 2 else 'NULL'
age = columns[2] if length >= 3 else 'NULL'

# 3. 打印處理之后的結果
print('\t'.join([name, gender, age]))

-- 查詢所有字段,將名字轉成大寫
select transform(*) using 'python3 string_name_upper.py' as (name, gender, age) from example_01;

+-----------+---------+------+
| name | gender | age |
+-----------+---------+------+
| ZHANGSAN | male | 19 |
| LISI | female | 20 |
| WANGWU | male | 18 |
| ZHAOLIU | female | 19 |
+-----------+---------+------+

  案例二:身份證解析

# 1. 準備數據文件
張三三,410023198911223344
李思思,110011200210103232
汪嗚嗚,37126520000223987X
趙溜溜,561276199512019866

# 2. 準備數據表
create table if not exists example_02(
username string,
idcard string
)
row format delimited
fields terminated by ',';

  需求:通過表中的數據,查詢出 姓名、身份證號、出生年月日、年齡、性別

# -*- coding: utf-8 -*-
# @Author : 大數據章魚哥
# @Company : 北京千鋒互聯科技有限公司

# 身份證驗證
# 如果身份證不是一個合法的身份證,輸出空
# 如果身份證是合法的,解析出年齡、生日、性別

import sys
import re
import datetime

def calculate_age(year, month, day):
now = datetime.datetime.now()
age = now.year - year
if now.month < month:
age -= 1
elif now.month == month and now.day < day:
age -= 1
return age

for line in sys.stdin:
# 1. 切割出來每一個組成部分
fields = line.strip().split('\t')
# 2. 如果長度不到兩位,說明數據有問題,不做任何處理
if len(fields) != 2:
continue
# 3. 提取姓名和身份證
name = fields[0]
id_card = fields[1]
# 4. 身份證正則匹配
m = re.fullmatch(r'(\d{6})(?P<year>(19|20)\d{2})(?P<month>0[1-9]|1[0-2])(?P<day>[012][0-9]|10|20|30|31)\d{2}(?P<gender>\d)[0-9xX]', id_card)
if m is None:
print('\t'.join([name, id_card, 'NULL', 'NULL', 'NULL']))
else:
# 出生年月日
year = m.group('year')
month = m.group('month')
day = m.group('day')
age = calculate_age(int(year), int(month), int(day))
# 計算性別
gender = '男' if int(m.group('gender')) % 2 != 0 else '女'
# 拼接生日
birthday = f'{year}-{month}-{day}'
print('\t'.join([name, id_card, birthday, str(age), gender]))

-- 添加文件
add file idcard_parser.py
-- 執行查詢
select transform(*) using 'python3 idcard_parser.py' as (name, idcard, birthday, age, gender) from example_02

+-------+---------------------+-------------+------+---------+
| name | idcard | birthday | age | gender |
+-------+---------------------+-------------+------+---------+
| 張三三 | 410023198911223344 | 1989-11-22 | 33 | 女 |
| 李思思 | 110011200210103232 | 2002-10-10 | 20 | 男 |
| 汪嗚嗚 | 37126520000223987X | 2000-02-23 | 22 | 男 |
| 趙溜溜 | 561276199512019866 | 1995-12-01 | 27 | 女 |
+-------+---------------------+-------------+------+---------+

  案例三:自定義聚合函數

# 準備數據
zhangsan,89
lisi,67
wangwu,55
zhaoliu,78
tianqi,92

# 建立數據表
create table if not exists example_03(
name string,
score int
)
row format delimited
fields terminated by ',';

  需求:通過表中的數據,統計出學生的人數、總成績、最高成績、最低成績、平均成績、及格率

  # -*- coding: utf-8 -*-

  # @Author : 大數據章魚哥

  # @Company : 北京千鋒互聯科技有限公司

  import sys

  scores = []

  for line in sys.stdin:

  scores.append(int(line.strip()))

  # 計算人數

  count = len(scores)

  # 計算總成績

  sum_score = sum(scores)

  # 計算最高成績

  max_score = max(scores)

  # 計算最低成績

  min_score = min(scores)

  # 計算平均成績

  avg_score = sum_score / count

  # 計算及格率

  rate = len(list(filter(lambda x: x >= 60, scores))) / count

  # 輸出最后的結果

  print('\t'.join(map(lambda x: str(x), [count, sum_score, max_score, min_score, avg_score, rate])))

  案例四:自定義展開函數

  # 1. 準備數據

  zhangsan 78,89,92,96

  lisi 67,75,83,94

  王五 23,12

  # 2. 建立數據表

  create table if not exists example_04(

  name string,

  scores array

  )

  row format delimited

  fields terminated by ' '

  collection items terminated by ','

  ;

  需求:根據表中的數據,將每一個成績展開,綁定給每一個名字

  # -*- coding: utf-8 -*-

  # @Author : 大數據章魚哥

  # @Company : 北京千鋒互聯科技有限公司

  import sys

  for line in sys.stdin:

  fields = line.strip().split('\t')

  if len(fields) != 2:

  continue

  # 提取名字

  name = fields[0]

  # 提取所有成績

  scores = fields[1].strip('[').rstrip(']').split(',')

  for s in scores:

  print("\t".join([name, s]))

分享: 更多

上一篇:Python如何操作Hive?

下一篇:Python操作HDFS

好程序員公眾號

  • · 剖析行業發展趨勢
  • · 匯聚企業項目源碼

好程序員開班動態

More+
  • HTML5大前端 <高端班>

    開班時間:2021-04-12(深圳)

    開班盛況

    開班時間:2021-05-17(北京)

    開班盛況
  • 大數據+人工智能 <高端班>

    開班時間:2021-03-22(杭州)

    開班盛況

    開班時間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發 <高端班>

    開班時間:2021-05-10(北京)

    開班盛況

    開班時間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數據分析 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2020-09-21(上海)

    開班盛況
  • 云計算開發 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2019-07-22(北京)

    開班盛況
IT培訓IT培訓
在線咨詢
IT培訓IT培訓
試聽
IT培訓IT培訓
入學教程
IT培訓IT培訓
立即報名
IT培訓

Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號

中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

            97久久超碰国产精品电影| 日本道在线观看一区二区| 青青草成人在线观看| 亚洲午夜精品网| 日韩国产在线一| 琪琪一区二区三区| 国产女人aaa级久久久级| 精品国产免费久久| 精品国产成人系列| 久久久久久久综合| 中文字幕一区二区三区在线观看| 国产精品卡一卡二| 一区二区免费在线播放| 日本不卡一二三| 国产乱子伦视频一区二区三区| 从欧美一区二区三区| av中文字幕亚洲| 在线不卡免费欧美| 精品三级在线看| 国产精品久久午夜| 亚洲va韩国va欧美va精品| 捆绑变态av一区二区三区| 成人免费不卡视频| 欧美三级日韩三级国产三级| 日韩精品一区国产麻豆| 国产精品麻豆99久久久久久| 偷窥少妇高潮呻吟av久久免费| 国产在线精品免费| 欧美日韩免费视频| 欧美激情一区二区三区蜜桃视频| 一区二区三区四区在线播放| 日韩成人免费在线| 99视频精品在线| 久久久精品日韩欧美| 亚洲成av人片| 色综合久久中文字幕综合网| 欧美videossexotv100| 亚洲影视在线观看| 岛国av在线一区| 久久天天做天天爱综合色| 亚洲一区二区在线视频| 成人91在线观看| 欧美大白屁股肥臀xxxxxx| 亚洲乱码国产乱码精品精的特点 | 成人av第一页| 国产午夜精品一区二区三区四区| 午夜日韩在线观看| 91在线观看成人| 国产精品人成在线观看免费 | 国产精品538一区二区在线| 精品美女在线播放| 美女国产一区二区三区| 欧美一区二区三区日韩视频| 麻豆91在线观看| 久久久久久久久久久久久久久99 | 欧美精品日韩一区| 丝袜脚交一区二区| 日韩欧美国产wwwww| 国产伦精品一区二区三区视频青涩| www国产精品av| av中文字幕亚洲| 亚洲乱码中文字幕| 在线亚洲精品福利网址导航| 亚洲人成伊人成综合网小说| 色综合久久88色综合天天6| 亚洲国产乱码最新视频| 欧美一区午夜精品| 国产成a人亚洲精品| 一区二区在线看| 日韩网站在线看片你懂的| 国产福利一区二区三区视频在线| 亚洲欧美日韩综合aⅴ视频| 欧美午夜片在线观看| 精品在线你懂的| 亚洲欧美一区二区三区国产精品 | 亚洲高清在线视频| 久久蜜桃av一区二区天堂| 一本色道久久综合狠狠躁的推荐| 日本欧美肥老太交大片| 国产精品嫩草影院com| 欧美日韩国产综合一区二区| 国产老女人精品毛片久久| 一区二区三区欧美| 久久蜜臀精品av| 91麻豆精品国产91久久久久| 99亚偷拍自图区亚洲| 久久99热狠狠色一区二区| 亚洲成年人影院| 亚洲另类色综合网站| 国产人成一区二区三区影院| 欧美一级二级三级蜜桃| 欧美在线视频你懂得| 国产91露脸合集magnet| 国产九色sp调教91| 蜜桃av一区二区| 亚洲超碰97人人做人人爱| 有码一区二区三区| 精品国产sm最大网站免费看| 成人精品视频一区二区三区| 久久97超碰色| 欧美r级电影在线观看| 九色综合国产一区二区三区| 亚洲成精国产精品女| 久久免费偷拍视频| bt7086福利一区国产| 日本 国产 欧美色综合| 亚洲一区二区视频在线| 一区二区三区四区不卡在线| 久久久久亚洲蜜桃| 久久九九99视频| 久久影视一区二区| 国产女人18水真多18精品一级做| 2024国产精品视频| 国产欧美一区二区精品久导航| 国产午夜亚洲精品理论片色戒| 国产日韩欧美综合在线| 国产精品久久一卡二卡| 亚洲精品久久久久久国产精华液| 亚洲一区二区三区中文字幕在线| 一区二区三区**美女毛片| 舔着乳尖日韩一区| 国产在线国偷精品免费看| 99精品国产视频| 欧美一区中文字幕| 国产精品的网站| 日本va欧美va瓶| av电影在线观看一区| 91精品国产一区二区| 亚洲国产成人私人影院tom| 亚洲黄色尤物视频| 国内成人自拍视频| 欧美日韩精品欧美日韩精品一综合| 欧美精品一区二区三区高清aⅴ | 亚洲午夜精品久久久久久久久| 九一久久久久久| 欧美视频中文字幕| 国产欧美一区二区精品久导航 | 成人综合婷婷国产精品久久蜜臀| 欧美日韩一区二区欧美激情| 欧美韩国一区二区| 日韩福利电影在线| 91丨九色丨蝌蚪富婆spa| 久久久一区二区三区捆绑**| 亚洲高清免费在线| 成人av手机在线观看| 久久综合狠狠综合久久激情| 一区二区三区精品视频| 成人黄色av电影| 久久综合国产精品| 国产一区91精品张津瑜| 欧美一区二区精品| 亚洲成人免费在线观看| 欧美日韩亚洲综合一区二区三区| 日韩理论电影院| 91麻豆自制传媒国产之光| 国产精品嫩草99a| 99久久精品免费看国产免费软件| 国产精品色一区二区三区| 成人爱爱电影网址| 国产精品国产成人国产三级| 不卡的av在线播放| 亚洲欧美一区二区在线观看| 91伊人久久大香线蕉| 亚洲综合久久久久| 欧美人妇做爰xxxⅹ性高电影| 天天影视网天天综合色在线播放| 91麻豆精品国产综合久久久久久| 久久se这里有精品| 国产色婷婷亚洲99精品小说| 成人动漫一区二区在线| 亚洲色图19p| 欧美精品国产精品| 久久99精品久久只有精品| 欧美精品一区在线观看| 成人av资源网站| 无码av免费一区二区三区试看 | www国产亚洲精品久久麻豆| 成人蜜臀av电影| 亚洲国产精品久久人人爱蜜臀| 欧美一区二视频| 97精品国产97久久久久久久久久久久| 亚洲成人动漫一区| 欧美激情艳妇裸体舞| 欧美日韩国产乱码电影| 国产成人在线看| 人人狠狠综合久久亚洲| 国产精品久久久久9999吃药| 欧美日韩成人在线| 国产精品888| 婷婷六月综合亚洲| 亚洲欧美日韩人成在线播放| 久久综合色天天久久综合图片| 色综合亚洲欧洲| 国产成人午夜精品影院观看视频| 日欧美一区二区| 亚洲精品视频在线看| 国产目拍亚洲精品99久久精品| 日韩视频国产视频| 欧美日韩成人在线一区| 色综合天天综合狠狠|