经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » Hadoop » 查看文章
Hive的原理
来源:cnblogs  作者:Simon92  时间:2019/4/28 8:45:14  对本文有异议

阅读目录

一、Hive内部表和外部表

1、Hive的create创建表的时候,选择的创建方式:

- create table

- create external table

2、特点:

● 在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!而表则不一样;

● 在删除表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!

注意:

1、- create table 创建内部表,create external table 创建外部表

2、建议在工作中用外部表来创建

二、Hive中的Partition

●  在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都储存在对应的目录中

  1. 例如:pvs 表中包含 ds city 两个 Partition,则
  2. 对应于 ds = 20090801, ctry = US HDFS 子目录为:/wh/pvs/ds=20090801/ctry=US
  3. 对应于 ds = 20090801, ctry = CA HDFS 子目录为;/wh/pvs/ds=20090801/ctry=CA

●  Partition是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照一定的规格和条件进行管理。

三、Hive中的 Bucket

  1. hivetable可以拆分成partitiontablepartition可以通过‘CLUSTERED BY
  2. ’进一步分bucketbucket中的数据可以通过‘SORT BY’排序。
  3. 'set hive.enforce.bucketing = true' 可以自动控制上一轮reduce的数量从而适
  4. bucket的个数,当然,用户也可以自主设置mapred.reduce.tasks去适配
  5. bucket个数

• Bucket主要作用:
– 数据sampling,随机采样
– 提升某些查询操作效率,例如mapside join

  1. 查看sampling数据:
  2. hive> select * from student tablesample(bucket 1 out of 2 on id);
  3. tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)
  4. y必须是tablebucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了64份,当y=32
  5. 时,抽取(64/32=)2bucket的数据,当y=128时,抽取(64/128=)1/2bucket的数据。x表示从哪个bucket开始抽
  6. 取。例如,tablebucket数为32tablesample(bucket 3 out of 16),表示总共抽取(32/16=2bucket的数据
  7. ,分别为第3bucket和第(3+16=)19bucket的数据

四、Hive数据类型

1、原生类型

  1. 原生类型
  2. TINYINT
  3. SMALLINT
  4. INT
  5. BIGINT
  6. BOOLEAN
  7. FLOAT
  8. DOUBLE
  9. STRING
  10. BINARYHive 0.8.0以上才可用)
  11. TIMESTAMPHive 0.8.0以上才可用)

2、复合类型

  1. 复合类型
  2. ArraysARRAY<data_type>
  3. Maps:MAP<primitive_type, data_type> ##复合类型
  4. Structs:STRUCT<col_name: data_type[COMMENT col_comment],……>
  5. Union:UNIONTYPE<data_type, data_type,……>

五、Hive SQL — — Join in MR

  1. INSERT OVERWRITE TABLE pv_users
  2. SELECT pv.pageid, u.age
  3. FROM page_view pv
  4. JOIN user u
  5. ON (pv.userid = u.userid);
  1. SELECT pageid, age, count(1)
  2. FROM pv_users
  3. GROUP BY pageid, age;

六、Hive的优化

• Map的优化:

– 作业会通过input的目录产生一个或者多个map任务。set dfs.block.size
– Map越多越好吗?是不是保证每个map处理接近文件块的大小?
– 如何合并小文件,减少map数?

  1. set mapred.max.split.size=100000000;
  2. set mapred.min.split.size.per.node=100000000;
  3. set mapred.min.split.size.per.rack=100000000;
  4. set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

– 如何适当的增加map数?

  1. set mapred.map.tasks=10;

– Map端聚合 hive.map.aggr=true 。 Mr中的Combiners.

 

 

五、函数嵌套

  1. def father(name):
  2. print('from father %s' %name)
  3. def son():
  4. print('from the son')
  5. def grandson():
  6. print('from the grandson')
  7. grandson()
  8. son()
  9.  
  10. father('朱锐')

六、闭包

1、闭包

  1. def father(name):
  2. print('from father %s' %name)
  3. def son():
  4. print('from the son')
  5. def grandson():
  6. print('from the grandson')
  7. grandson()
  8. son()
  9.  
  10. father('朱锐')
  11.  
  12. '''
  13. 闭包
  14. '''
  15.  
  16. def father(name):
  17. def son():
  18. # name='simon1'
  19. print('我的爸爸是%s' %name)
  20. def grandson():
  21. print('我的爷爷是%s' %name)
  22. grandson()
  23. son()
  24. father('simon')

2、函数闭包装饰器基本实现

  1. import time
  2. def timmer(func):
  3. def wrapper():
  4. # print(func)
  5. start_time=time.time()
  6. func() #就是在运行test()
  7. stop_time=time.time()
  8. print('运行时间是%s' %(stop_time-start_time))
  9. return wrapper
  10. @timmer #语法糖,这个是重点
  11.  
  12. def test():
  13. time.sleep(3)
  14. print('test函数运行完毕')
  15.  
  16. # res=timmer(test) #返回的是wrapper的地址
  17. # res() #执行的是wrapper()
  18.  
  19. # test=timmer(test) #返回的是wrapper的地址
  20. # test() #执行的是wrapper()
  21.  
  22. test()
  23. '''
  24. 语法糖
  25. '''
  26. # @timmer #就相当于 test=timmer(test)

3、函数闭包加上返回值

  1. #未加返回值
  2. import time
  3. def timmer(func):
  4. def wrapper():
  5. # print(func)
  6. start_time=time.time()
  7. func() #就是在运行test()
  8. stop_time=time.time()
  9. print('运行时间是%s' %(stop_time-start_time))
  10. return 123
  11. return wrapper
  12. @timmer #语法糖
  13.  
  14. def test():
  15. time.sleep(3)
  16. print('test函数运行完毕')
  17. return '这是test的返回值'
  18. res=test() #就是在运行wrapper
  19. print(res)
  20.  
  21. 运行结果如下:
  22. C:\Python35\python3.exe G:/python_s3/day20/加上返回值.py
  23. test函数运行完毕
  24. 运行时间是3.000171661376953
  25. 123
  1. #加上返回值
  2. import time
  3. def timmer(func):
  4. def wrapper():
  5. # print(func)
  6. start_time=time.time()
  7. res=func() #就是在运行test() ##主要修改这里1
  8. stop_time=time.time()
  9. print('运行时间是%s' %(stop_time-start_time))
  10. return res ##修改这里2
  11. return wrapper
  12. @timmer #语法糖
  13.  
  14. def test():
  15. time.sleep(3)
  16. print('test函数运行完毕')
  17. return '这是test的返回值'
  18. res=test() #就是在运行wrapper
  19. print(res)
  20.  
  21. 运行结果如下:
  22. C:\Python35\python3.exe G:/python_s3/day20/加上返回值.py
  23. test函数运行完毕
  24. 运行时间是3.000171661376953
  25. 这是test的返回值

4、函数闭包加上参数

  1. import time
  2. def timmer(func):
  3. def wrapper(name,age): #加入参数,name,age
  4. # print(func)
  5. start_time=time.time()
  6. res=func(name,age) ##加入参数,name,age
  7. stop_time=time.time()
  8. print('运行时间是%s' %(stop_time-start_time))
  9. return res
  10. return wrapper
  11. @timmer #语法糖
  12.  
  13. def test(name,age): #加入参数,name,age
  14. time.sleep(3)
  15. print('test函数运行完毕,名字是【%s】,年龄是【%s】' % (name,age))
  16. return '这是test的返回值'
  17. res=test('simon',18) #就是在运行wrapper
  18. print(res)

使用可变长参数代码如下:达到的效果是传参灵活

  1. import time
  2. def timmer(func):
  3. def wrapper(*args,**kwargs): #test('simon',18) args=('simon') kwargs={'age':18}
  4. # print(func)
  5. start_time=time.time()
  6. res=func(*args,**kwargs) #就是在运行test() func(*('simon'),**{'age':18})
  7. stop_time=time.time()
  8. print('运行时间是%s' %(stop_time-start_time))
  9. return res
  10. return wrapper
  11. @timmer #语法糖
  12.  
  13. def test(name,age):
  14. time.sleep(3)
  15. print('test函数运行完毕,名字是【%s】,年龄是【%s】' % (name,age))
  16. return '这是test的返回值'
  17. def test1(name,age,gender):
  18. time.sleep(1)
  19. print('test函数运行完毕,名字是【%s】,年龄是【%s】,性别是【%s】' % (name,age,gender))
  20. res=test('simon',18) #就是在运行wrapper
  21. print(res)
  22.  
  23. test1('simon',18,'male')

 

5、装饰器的使用

  1. #无参装饰器
  2. import time
  3. def timmer(func):
  4. def wrapper(*args,**kwargs):
  5. start_time=time.time()
  6. res=func(*args,**kwargs)
  7. stop_time=time.time()
  8. print('run time is %s' %(stop_time-start_time))
  9. return res
  10. return wrapper
  11. @timmer
  12. def foo():
  13. time.sleep(3)
  14. print('from foo')
  15. foo()
  1. #有参装饰器
  2. def auth(driver='file'):
  3. def auth2(func):
  4. def wrapper(*args,**kwargs):
  5. name=input("user: ")
  6. pwd=input("pwd: ")
  7. if driver == 'file':
  8. if name == 'simon' and pwd == '123':
  9. print('login successful')
  10. res=func(*args,**kwargs)
  11. return res
  12. elif driver == 'ldap':
  13. print('ldap')
  14. return wrapper
  15. return auth2
  16. @auth(driver='file')
  17. def foo(name):
  18. print(name)
  19. foo('simon')

 #验证功能装饰器

  1. #验证功能装饰器
  2. user_list=[
  3. {'name':'simon','passwd':'123'},
  4. {'name':'zhurui','passwd':'123'},
  5. {'name':'william','passwd':'123'},
  6. {'name':'zhurui1','passwd':'123'},
  7. ]
  8. current_dic={'username':None,'login':False}
  9. def auth_func(func):
  10. def wrapper(*args,**kwargs):
  11. if current_dic['username'] and current_dic['login']:
  12. res=func(*args,**kwargs)
  13. return res
  14. username=input('用户名:').strip()
  15. passwd=input('密码:').strip()
  16. for user_dic in user_list:
  17. if username == user_dic['name'] and passwd == user_dic['passwd']:
  18. current_dic['username']=username
  19. current_dic['login']=True
  20. res=func(*args,**kwargs)
  21. return res
  22. else:
  23. print('用户名或者密码错误')
  24. # if username == 'simon' and passwd == '123':
  25. # user_dic['username']=username
  26. # user_dic['login']=True
  27. # res=func(*args,**kwargs)
  28. # return res
  29. # else:
  30. # print('用户名或密码错误')
  31. return wrapper
  32. @auth_func
  33. def index():
  34. print('欢迎来到某宝首页')
  35. @auth_func
  36. def home(name):
  37. print('欢迎回家%s' %name)
  38. @auth_func
  39. def shopping_car(name):
  40. print('%s购物车里有[%s,%s,%s]' %(name,'餐具','沙发','电动车'))
  41. print('before----->',current_dic)
  42. index()
  43. print('after---->',current_dic)
  44. home('simon')
  45. # shopping_car('simon')

#带参数验证功能装饰器

  1. #带参数验证功能装饰器
  2. user_list=[
  3. {'name':'simon','passwd':'123'},
  4. {'name':'zhurui','passwd':'123'},
  5. {'name':'william','passwd':'123'},
  6. {'name':'zhurui1','passwd':'123'},
  7. ]
  8. current_dic={'username':None,'login':False}
  9. def auth(auth_type='filedb'):
  10. def auth_func(func):
  11. def wrapper(*args,**kwargs):
  12. print('认证类型是',auth_type)
  13. if auth_type == 'filedb':
  14. if current_dic['username'] and current_dic['login']:
  15. res = func(*args, **kwargs)
  16. return res
  17. username=input('用户名:').strip()
  18. passwd=input('密码:').strip()
  19. for user_dic in user_list:
  20. if username == user_dic['name'] and passwd == user_dic['passwd']:
  21. current_dic['username']=username
  22. current_dic['login']=True
  23. res = func(*args, **kwargs)
  24. return res
  25. else:
  26. print('用户名或者密码错误')
  27. elif auth_type == 'ldap':
  28. print('这玩意没搞过,不知道怎么玩')
  29. res = func(*args, **kwargs)
  30. return res
  31. else:
  32. print('鬼才知道你用的什么认证方式')
  33. res = func(*args, **kwargs)
  34. return res
  35. return wrapper
  36. return auth_func
  37. @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type --->index=auth_func(index)
  38. def index():
  39. print('欢迎来到某宝主页')
  40. @auth(auth_type='ldap')
  41. def home(name):
  42. print('欢迎回家%s' %name)
  43. #
  44. @auth(auth_type='sssssss')
  45. def shopping_car(name):
  46. print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))
  47. # print('before-->',current_dic)
  48. # index()
  49. # print('after--->',current_dic)
  50. # home('simon')
  51. shopping_car('simon')

 

原文链接:http://www.cnblogs.com/hackerer/p/10781289.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号