利用Python实现Hive UDF ( Docker集群镜像 )

写在前面

  • 搭建Docker版镜像集群,为大数据开发准备基础环境。
  • 基于Python 完成Hive UDF函数
  • 提示
    • 需要有Docker基础,若无请自行百度。
  • 目的
    • 实现Python版本UDF

P1: 建立Docker版镜像集群

  • 步骤如下:
# 1 拉取现有集群镜像
docker pull limengjiao029/hive:v0.1
    
# 2 基于镜像创建容器实例
docker run --privileged -tid -p 8000:8000 -p 8088:8088 -p 8042:8042 -p 50070:50070 limengjiao029/hive:v0.1
                    
# 3 进入容器,替换容器 ID, 需要Docker基础
docker exec -ti containerID /bin/bash

# 4 首先,启动 hadoop
$HADOOP_HOME\sbin\start-all.sh

# 5 启动metastore服务
hive --service metastore

# 6 使用 cli
hive

P2: 实现Python UDF测试开发

# 1 进入 hive cli,创建person 表
create external table person(
name string,
idcard string)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t'
STORED as TEXTFILE;

# 2 在Linux 宿主机建立测试数据 person.txt,内容如下
neil    411326199402110030
pony    41132519950911004x
jcak    12312423454556561
tony    412345671234908

# 3 将本地 person.txt 文件提交至 hive 仓库
hdfs dfs -put person.txt /user/hive/warehouse/person

# 4 Hive 等价 HQL
select idcard,
case when length(idcard) = 18 then
             case when substring(idcard,-2,1) % 2 = 1 then '男' 
             when substring(idcard,-2,1) % 2 = 0 then '女' 
             else 'unknown' end 
     when length(idcard) = 15 then 
            case when substring(idcard,-1,1) % 2 = 1 then '男'
            when substring(idcard,-1,1) % 2 = 0 then '女'
            else 'unknown' end
     else '不合法' end 
from person;

# 5 实现 Python udf代码
# -*- coding: utf-8 -*-
import sys

for line in sys.stdin:
    detail = line.strip().split("\t")
    if len(detail) != 2:
        continue
    else:
        name = detail[0]
        idcard = detail[1]
        if len(idcard) == 15:
            if int(idcard[-1]) % 2 == 0:
                print("\t".join([name,idcard,"女"]))
            else:
                print("\t".join([name,idcard,"男"]))
        elif len(idcard) == 18:
            if int(idcard[-2]) % 2 == 0:
                print("\t".join([name,idcard,"女"]))
            else:
                print("\t".join([name,idcard,"男"]))
        else:
            print("\t".join([name,idcard,"身份信息不合法!"]))
            
# 6 将person.py 文件添加至资源库中
add file /home/kngines/hive_test/person.py

# 7 前提
hive中使用python定义的UDF函数要借助transform函数去执行

# 8 基于transform 使用 Python版 UDF,进行结果查询
select
    transform(name,idcard) USING 'python person.py'  AS (name,idcard,gender)
from person;

P3: 结果展示及其他

  • 结果详情
    利用Python实现Hive UDF ( Docker集群镜像 )
  • transform语法
    • 其中,transfrom和as的columns的个数不必一致
SELECT TRANSFORM (<columns>)
USING 'python <python_script>'
AS (<columns>)
FROM <table>;
  • 查看系统内存/磁盘
# free 命令是一个显示系统中空闲和已用内存大小的工具
free -h

# 查看磁盘详情
df -h
  • Hive 显示列名
set hive.cli.print.header=true;

Other Refs

  • Hive HDF 引用资源文件路径问题
  • big-data-europe
  • 小插曲
    • 本计划实验在私人服务器上完成,毕竟每次开关虚拟机真心费心费神。ECS 单核 2GB内存,在运行包含Python UDF的HQL时,莫名地被 Killed, 竟然是内存不足!
    • 啊哈,只能在本地虚拟机完成实验,好在个人笔记本 32GB内存,1T固态,不费事!
    • 吹完牛,后续精彩:
      • 完成通过自定义函数引用资源,例如表资源、文件资源、数据资源等实验
      • xj.wlmq.20190401.01:23