成人午夜一区二区_操碰在线视频_国产精品麻豆一区二区三区_中文黄色一级片_欧美日本中文字幕_高清视频91

當(dāng)前位置: 首頁 / 技術(shù)干貨 / 正文
Python實現(xiàn)Hive的UDF函數(shù)

2023-02-23

   scores

Python實現(xiàn)Hive的UDF函數(shù)

  Python實現(xiàn)UDF函數(shù)的邏輯

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

  import sys

  # sys.stdin: 標(biāo)準(zhǔn)輸入流,我們使用的input()函數(shù),其實就是stdin的一個方法。

  # hive執(zhí)行自定義函數(shù)的時候,會逐行讀取指定列的內(nèi)容,我們就可以使用循環(huán)依次處理讀取到的每一行的數(shù)據(jù)。

  for line in sys.stdin:

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

  # 切割出來每一個列

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

  # 對列進(jìn)行處理

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

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

  print('hello world')

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

  # 1. 加載腳本文件

  add file <腳本文件>

  # 2. 執(zhí)行腳本,執(zhí)行Python的UDF函數(shù)的時候,只能使用transform函數(shù)

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

  自定義UDF函數(shù)案例

  案例一:將字母轉(zhuǎn)成全部大寫

# 1. 準(zhǔn)備數(shù)據(jù)文件
zhangsan,male,19
lisi,female,20
wangwu,male,18
zhaoliu,female,19

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

  需求:將所有的列都轉(zhuǎn)成大寫

# -*- coding: utf-8 -*-
# @Author : 大數(shù)據(jù)章魚哥
# @Company : 北京千鋒互聯(lián)科技有限公司

# string_upper.py
import sys

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

-- 應(yīng)用UDF
add file string_upper.py

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

  需求:只需要將姓名轉(zhuǎn)成大寫

# -*- coding: utf-8 -*-
# @Author : 大數(shù)據(jù)章魚哥
# @Company : 北京千鋒互聯(lián)科技有限公司

# string_name_upper.py
import sys

for line in sys.stdin:
# 1. 切割出來每一列
columns = line.strip().split('\t')
# 2. 判斷切割出來的列的數(shù)量,如果數(shù)量不正確,這一行數(shù)據(jù)不處理
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. 打印處理之后的結(jié)果
print('\t'.join([name, gender, age]))

-- 查詢所有字段,將名字轉(zhuǎn)成大寫
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. 準(zhǔn)備數(shù)據(jù)文件
張三三,410023198911223344
李思思,110011200210103232
汪嗚嗚,37126520000223987X
趙溜溜,561276199512019866

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

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

# -*- coding: utf-8 -*-
# @Author : 大數(shù)據(jù)章魚哥
# @Company : 北京千鋒互聯(lián)科技有限公司

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

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. 如果長度不到兩位,說明數(shù)據(jù)有問題,不做任何處理
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
-- 執(zhí)行查詢
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 | 女 |
+-------+---------------------+-------------+------+---------+

  案例三:自定義聚合函數(shù)

# 準(zhǔn)備數(shù)據(jù)
zhangsan,89
lisi,67
wangwu,55
zhaoliu,78
tianqi,92

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

  需求:通過表中的數(shù)據(jù),統(tǒng)計出學(xué)生的人數(shù)、總成績、最高成績、最低成績、平均成績、及格率

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

  # @Author : 大數(shù)據(jù)章魚哥

  # @Company : 北京千鋒互聯(lián)科技有限公司

  import sys

  scores = []

  for line in sys.stdin:

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

  # 計算人數(shù)

  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

  # 輸出最后的結(jié)果

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

  案例四:自定義展開函數(shù)

  # 1. 準(zhǔn)備數(shù)據(jù)

  zhangsan 78,89,92,96

  lisi 67,75,83,94

  王五 23,12

  # 2. 建立數(shù)據(jù)表

  create table if not exists example_04(

  name string,

  scores array

  )

  row format delimited

  fields terminated by ' '

  collection items terminated by ','

  ;

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

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

  # @Author : 大數(shù)據(jù)章魚哥

  # @Company : 北京千鋒互聯(lián)科技有限公司

  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

好程序員公眾號

  • · 剖析行業(yè)發(fā)展趨勢
  • · 匯聚企業(yè)項目源碼

好程序員開班動態(tài)

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

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

    開班盛況

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

    開班盛況
  • 大數(shù)據(jù)+人工智能 <高端班>

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

    開班盛況

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

    開班盛況
  • JavaEE分布式開發(fā) <高端班>

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

    開班盛況

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

    開班盛況
  • Python人工智能+數(shù)據(jù)分析 <高端班>

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

    預(yù)約報名

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

    開班盛況
  • 云計算開發(fā) <高端班>

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

    預(yù)約報名

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

    開班盛況
IT培訓(xùn)IT培訓(xùn)
在線咨詢
IT培訓(xùn)IT培訓(xùn)
試聽
IT培訓(xùn)IT培訓(xùn)
入學(xué)教程
IT培訓(xùn)IT培訓(xùn)
立即報名
IT培訓(xùn)

Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號-5 京公網(wǎng)安備 11010802035720號

主站蜘蛛池模板: 日韩精品免费一区二区夜夜嗨 | 正在播放国产精品 | 欧美国产另类 | 国产午夜精品久久久 | 免费视频一区 | 欧美日韩在线第一页 | 久久激情av| 五月综合激情 | 亚洲精品成人久久 | 国产精品99 | 国产精品a久久久久 | 国产精品成人av | 日韩精品在线观看视频 | 久久久精品一区二区 | 欧美视频一区二区在线观看 | 国产九色 | 国产在线精品一区二区在线播放 | 国产精品一区二区久久久久 | 欧美日韩在线一区二区三区 | 日韩激情视频 | 精品精品国产三级a∨在线 在线国产精品视频 | 蜜桃精品一区二区三区 | 99re在线精品 | 91免费在线 | 国产精品成人国产乱一区 | 国产精品毛片一区二区在线看 | 成人免费高清视频 | 亚洲精品aⅴ中文字幕乱码 九九九久久 | 欧美亚洲高清 | 国产精品免费观看 | 欧美日韩电影一区二区三区 | 国产精品99精品久久免费 | 日本在线观看一区 | 日本中文字幕在线播放 | 国产精品视频免费看 | 色姑娘天天综合 | 91麻豆精品91久久久久久清纯 | √新版天堂资源在线资源 | 欧美3区| 亚洲狼人综合 | 美女国内精品自产拍在线播放 |