本文主要讲解利用python 生成hive数据,主要包括python数据生成,数据上传hdfs,hive建库建表,hive导入数据,hive验证数据的正确性。
hive建库建表
hive调优实战系列文章使用学生信息表和选课表来作为数据支撑,下面是这两张表的建表语句。
create database test;
create table if not exists student_txt(
`no` string comment '学号',
`name` string comment '姓名',
`birth` string comment '生日',
`age` string comment '年龄',
`sex` string comment '性别')
row format delimited
fields terminated by '\t';
create table if not exists course_txt(
`no` string comment '学号',
`course` string comment '课程名',
`stats_dt` string comment '操作时间'
)
row format delimited
fields terminated by '\t';
python数据生成
我们通过一下代码生成测试数据:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : init_hive_data.py
@Description : None
@Version : 1.0
@Modify Time : 2020/6/17 21:40
"""
import hashlib
import random
import string
import time
import uuid
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def gen_uuid():
return str(uuid.uuid1())
def random_date(year1=1992, year2=2000):
a1 = (year1, 1, 1, 0, 0, 0, 0, 0, 0)
a2 = (year2, 12, 31, 23, 59, 59, 0, 0, 0)
start = time.mktime(a1)
end = time.mktime(a2)
t = random.randint(start, end)
date_tuple = time.localtime(t)
date = time.strftime("%Y-%m-%d", date_tuple)
return date
def random_int():
a = [1, 2, 3, 4, 5, 6, 8, 10, 12]
if a[random.randint(1, 7)] % 2 == 0:
return random.randint(60, 100)
else:
return random.randint(0, 60)
def random_course():
return random.sample([u'数学', u'数学', u'数学', u'数学', u'数学', u'语文', u'英语', u'化学', u'物理', u'生物'],
random.randint(1, 5))
last_name_list = [u"李", u"王", u"张", u"刘", u"陈", u"杨", u"赵", u"黄", u"周", u"吴", u"徐", u"孙", u"胡", u"朱",
u"高", u"林", u"何", u"郭", u"马", u"罗", u"梁", u"宋", u"郑", u"谢", u"韩", u"唐", u"冯", u"于",
u"董", u"萧", u"程", u"曹", u"袁", u"邓", u"许", u"傅", u"沈", u"曾", u"彭", u"吕", u"苏", u"卢",
u"蒋", u"蔡", u"贾", u"丁", u"魏", u"薛", u"叶", u"阎", u"余", u"潘", u"杜", u"戴", u"夏", u"钟",
u"汪", u"田", u"任", u"姜", u"范", u"方", u"石", u"姚", u"谭", u"廖", u"邹", u"熊", u"金", u"陆",
u"郝", u"孔", u"白", u"崔", u"康", u"毛", u"邱", u"秦", u"江", u"史", u"顾", u"侯", u"邵", u"孟",
u"龙", u"万", u"段", u"漕", u"钱", u"汤", u"尹", u"黎", u"易", u"常", u"武", u"乔", u"贺", u"赖",
u"龚", u"文"]
first_name_list = [u'的', u'一', u'是', u'了', u'我', u'不', u'人', u'在', u'他', u'有', u'这', u'个', u'上', u'们', u'来', u'到', u'时',
u'大', u'地', u'为',
u'子', u'中', u'你', u'说', u'生', u'国', u'年', u'着', u'就', u'那', u'和', u'要', u'她', u'出', u'也', u'得', u'里',
u'后', u'自', u'以',
u'会', u'家', u'可', u'下', u'而', u'过', u'天', u'去', u'能', u'对', u'小', u'多', u'然', u'于', u'心', u'学', u'么',
u'之', u'都', u'好',
u'看', u'起', u'发', u'当', u'没', u'成', u'只', u'如', u'事', u'把', u'还', u'用', u'第', u'样', u'道', u'想', u'作',
u'种', u'开', u'美',
u'总', u'从', u'无', u'情', u'己', u'面', u'最', u'女', u'但', u'现', u'前', u'些', u'所', u'同', u'日', u'手', u'又',
u'行', u'意', u'动',
u'方', u'期', u'它', u'头', u'经', u'长', u'儿', u'回', u'位', u'分', u'爱', u'老', u'因', u'很', u'给', u'名', u'法',
u'间', u'斯', u'知',
u'世', u'什', u'两', u'次', u'使', u'身', u'者', u'被', u'高', u'已', u'亲', u'其', u'进', u'此', u'话', u'常', u'与',
u'活', u'正', u'感',
u'见', u'明', u'问', u'力', u'理', u'尔', u'点', u'文', u'几', u'定', u'本', u'公', u'特', u'做', u'外', u'孩', u'相',
u'西', u'果', u'走',
u'将', u'月', u'十', u'实', u'向', u'声', u'车', u'全', u'信', u'重', u'三', u'机', u'工', u'物', u'气', u'每', u'并',
u'别', u'真', u'打',
u'太', u'新', u'比', u'才', u'便', u'夫', u'再', u'书', u'部', u'水', u'像', u'眼', u'等', u'体', u'却', u'加', u'电',
u'主', u'界', u'门',
u'利', u'海', u'受', u'听', u'表', u'德', u'少', u'克', u'代', u'员', u'许', u'稜', u'先', u'口', u'由', u'死', u'安',
u'写', u'性', u'马',
u'光', u'白', u'或', u'住', u'难', u'望', u'教', u'命', u'花', u'结', u'乐', u'色', u'更', u'拉', u'东', u'神', u'记',
u'处', u'让', u'母',
u'父', u'应', u'直', u'字', u'场', u'平', u'报', u'友', u'关', u'放', u'至', u'张', u'认', u'接', u'告', u'入', u'笑',
u'内', u'英', u'军',
u'候', u'民', u'岁', u'往', u'何', u'度', u'山', u'觉', u'路', u'带', u'万', u'男', u'边', u'风', u'解', u'叫', u'任',
u'金', u'快', u'原',
u'吃', u'妈', u'变', u'通', u'师', u'立', u'象', u'数', u'四', u'失', u'满', u'战', u'远', u'格', u'士', u'音', u'轻',
u'目', u'条', u'呢',
u'病', u'始', u'达', u'深', u'完', u'今', u'提', u'求', u'清', u'王', u'化', u'空', u'业', u'思', u'切', u'怎', u'非',
u'找', u'片', u'罗',
u'钱', u'紶', u'吗', u'语', u'元', u'喜', u'曾', u'离', u'飞', u'科', u'言', u'干', u'流', u'欢', u'约', u'各', u'即',
u'指', u'合', u'反',
u'题', u'必', u'该', u'论', u'交', u'终', u'林', u'请', u'医', u'晚', u'制', u'球', u'决', u'窢', u'传', u'画', u'保',
u'读', u'运', u'及',
u'则', u'房', u'早', u'院', u'量', u'苦', u'火', u'布', u'品', u'近', u'坐', u'产', u'答', u'星', u'精', u'视', u'五',
u'连', u'司', u'巴',
u'奇', u'管', u'类', u'未', u'朋', u'且', u'婚', u'台', u'夜', u'青', u'北', u'队', u'久', u'乎', u'越', u'观', u'落',
u'尽', u'形', u'影',
u'红', u'爸', u'百', u'令', u'周', u'吧', u'识', u'步', u'希', u'亚', u'术', u'留', u'市', u'半', u'热', u'送', u'兴',
u'造', u'谈', u'容',
u'极', u'随', u'演', u'收', u'首', u'根', u'讲', u'整', u'式', u'取', u'照', u'办', u'强', u'石', u'古', u'华', u'諣',
u'拿', u'计', u'您',
u'装', u'似', u'足', u'双', u'妻', u'尼', u'转', u'诉', u'米', u'称', u'丽', u'客', u'南', u'领', u'节', u'衣', u'站',
u'黑', u'刻', u'统',
u'断', u'福', u'城', u'故', u'历', u'惊', u'脸', u'选', u'包', u'紧', u'争', u'另', u'建', u'维', u'绝', u'树', u'系',
u'伤', u'示', u'愿',
u'持', u'千', u'史', u'谁', u'准', u'联', u'妇', u'纪', u'基', u'买', u'志', u'静', u'阿', u'诗', u'独', u'复', u'痛',
u'消', u'社', u'算',
u'义', u'竟', u'确', u'酒', u'需', u'单', u'治', u'卡', u'幸', u'兰', u'念', u'举', u'仅', u'钟', u'怕', u'共', u'毛',
u'句', u'息', u'功',
u'官', u'待', u'究', u'跟', u'穿', u'室', u'易', u'游', u'程', u'号', u'居', u'考', u'突', u'皮', u'哪', u'费', u'倒',
u'价', u'图', u'具',
u'刚', u'脑', u'永', u'歌', u'响', u'商', u'礼', u'细', u'专', u'黄', u'块', u'脚', u'味', u'灵', u'改', u'据', u'般',
u'破', u'引', u'食',
u'仍', u'存', u'众', u'注', u'笔', u'甚', u'某', u'沉', u'血', u'备', u'习', u'校', u'默', u'务', u'土', u'微', u'娘',
u'须', u'试', u'怀',
u'料', u'调', u'广', u'蜖', u'苏', u'显', u'赛', u'查', u'密', u'议', u'底', u'列', u'富', u'梦', u'错', u'座', u'参',
u'八', u'除', u'跑',
u'亮', u'假', u'印', u'设', u'线', u'温', u'虽', u'掉', u'京', u'初', u'养', u'香', u'停', u'际', u'致', u'阳', u'纸',
u'李', u'纳', u'验',
u'助', u'激', u'够', u'严', u'证', u'帝', u'饭', u'忘', u'趣', u'支', u'春', u'集', u'丈', u'木', u'研', u'班', u'普',
u'导', u'顿', u'睡',
u'展', u'跳', u'获', u'艺', u'六', u'波', u'察', u'群', u'皇', u'段', u'急', u'庭', u'创', u'区', u'奥', u'器', u'谢',
u'弟', u'店', u'否',
u'害', u'草', u'排', u'背', u'止', u'组', u'州', u'朝', u'封', u'睛', u'板', u'角', u'况', u'曲', u'馆', u'育', u'忙',
u'质', u'河', u'续',
u'哥', u'呼', u'若', u'推', u'境', u'遇', u'雨', u'标', u'姐', u'充', u'围', u'案', u'伦', u'护', u'冷', u'警', u'贝',
u'著', u'雪', u'索',
u'剧', u'啊', u'船', u'险', u'烟', u'依', u'斗', u'值', u'帮', u'汉', u'慢', u'佛', u'肯', u'闻', u'唱', u'沙', u'局',
u'伯', u'族', u'低',
u'玩', u'资', u'屋', u'击', u'速', u'顾', u'泪', u'洲', u'团', u'圣', u'旁', u'堂', u'兵', u'七', u'露', u'园', u'牛',
u'哭', u'旅', u'街',
u'劳', u'型', u'烈', u'姑', u'陈', u'莫', u'鱼', u'异', u'抱', u'宝', u'权', u'鲁', u'简', u'态', u'级', u'票', u'怪',
u'寻', u'杀', u'律',
u'胜', u'份', u'汽', u'右', u'洋', u'范', u'床', u'舞', u'秘', u'午', u'登', u'楼', u'贵', u'吸', u'责', u'例', u'追',
u'较', u'职', u'属',
u'渐', u'左', u'录', u'丝', u'牙', u'党', u'继', u'托', u'赶', u'章', u'智', u'冲', u'叶', u'胡', u'吉', u'卖', u'坚',
u'喝', u'肉', u'遗',
u'救', u'修', u'松', u'临', u'藏', u'担', u'戏', u'善', u'卫', u'药', u'悲', u'敢', u'靠', u'伊', u'村', u'戴', u'词',
u'森', u'耳', u'差',
u'短', u'祖', u'云', u'规', u'窗', u'散', u'迷', u'油', u'旧', u'适', u'乡', u'架', u'恩', u'投', u'弹', u'铁', u'博',
u'雷', u'府', u'压',
u'超', u'负', u'勒', u'杂', u'醒', u'洗', u'采', u'毫', u'嘴', u'毕', u'九', u'冰', u'既', u'状', u'乱', u'景', u'席',
u'珍', u'童', u'顶',
u'派', u'素', u'脱', u'农', u'疑', u'练', u'野', u'按', u'犯', u'拍', u'征', u'坏', u'骨', u'余', u'承', u'置', u'臓',
u'彩', u'灯', u'巨',
u'琴', u'免', u'环', u'姆', u'暗', u'换', u'技', u'翻', u'束', u'增', u'忍', u'餐', u'洛', u'塞', u'缺', u'忆', u'判',
u'欧', u'层', u'付',
u'阵', u'玛', u'批', u'岛', u'项', u'狗', u'休', u'懂', u'武', u'革', u'良', u'恶', u'恋', u'委', u'拥', u'娜', u'妙',
u'探', u'呀', u'营',
u'退', u'摇', u'弄', u'桌', u'熟', u'诺', u'宣', u'银', u'势', u'奖', u'宫', u'忽', u'套', u'康', u'供', u'优', u'课',
u'鸟', u'喊', u'降',
u'夏', u'困', u'刘', u'罪', u'亡', u'鞋', u'健', u'模', u'败', u'伴', u'守', u'挥', u'鲜', u'财', u'孤', u'枪', u'禁',
u'恐', u'伙', u'杰',
u'迹', u'妹', u'藸', u'遍', u'盖', u'副', u'坦', u'牌', u'江', u'顺', u'秋', u'萨', u'菜', u'划', u'授', u'归', u'浪',
u'听', u'凡', u'预',
u'奶', u'雄', u'升', u'碃', u'编', u'典', u'袋', u'莱', u'含', u'盛', u'济', u'蒙', u'棋', u'端', u'腿', u'招', u'释',
u'介', u'烧', u'误',
u'乾', u'坤']
def random_last_name():
return random.sample(last_name_list, 1)[0]
def random_first_name():
return random.sample(first_name_list, 1)[0] + random.sample(first_name_list, 1)[0]
def random_sex():
return random.sample([u'男', u'女'], 1)[0]
if __name__ == '__main__':
for j in xrange(100):
student_fp = open('./student/' + 'student' + str(j) + '.txt', mode='wr+')
course_fp = open('./course/' + 'course' + str(j) + '.txt', mode='wr+')
print j
for i in xrange(100000):
no = gen_id()
last_name = random_last_name()
first_name = random_first_name()
name = last_name + first_name
birth = random_date()
age = 2020 - int(birth.split('-')[0])
sex = random_sex()
student_line = "{0}\t{1}\t{2}\t{3}\t{4}\n".format(no, name, birth, str(age), str(sex))
student_fp.write(student_line)
course_set = set(random_course())
for course in course_set:
score = random_int()
stats_dt = random_date(year1=2019, year2=2020)
course_line = "{0}\t{1}\t{2}\t{3}\n".format(no, course, score, stats_dt)
course_fp.write(course_line)
student_fp.flush()
student_fp.close()
course_fp.flush()
course_fp.close()
数据上传hdfs
用hdfs 命令将数据上传hdfs:
hdfs dfs -put student/ /tmp/hongsuo_liu/data/
hdfs dfs -put course/ /tmp/hongsuo_liu/data/
hive导入数据
LOAD DATA INPATH "/tmp/hongsuo_liu/data/student/" INTO TABLE student_txt;
LOAD DATA INPATH "/tmp/hongsuo_liu/data/course/" INTO TABLE course_txt;
hive数据验证
至此我们的数据已全部准备完成。