美文网首页玩转大数据大数据 爬虫Python AI Sql大数据
大数据初学者福利:Hive基本使用教程

大数据初学者福利:Hive基本使用教程

作者: 丨程序之道丨 | 来源:发表于2019-01-10 14:26 被阅读1次

    蜂房基础数据类型

    蜂巢是用的Java开发的,蜂巢的里基本数据类型和Java的的基本数据类型也是一一对应的,除了字符串类型有符号的整数类型:TINYINT,SMALLINT,INT和BIGINT分别等价于Java的字节的,短型,整型和长原子类型,它们分别为1字节,2字节,4字节和8字节有符号整数.Hive的浮点数据类型FLOAT和DOUBLE,对应于的java的基本类型浮动和双类型。而蜂房的布尔类型相当于Java的的基本数据类型布尔值。

    蜂巢复杂数据类型

    包括阵列,MAP,结构,联合。这些复杂类型是由基础类型组成的。

    ARRAY:。ARRAY类型是由一系列同样数据类型元素组成的,这些元素能够通过下标来访问比方有一个ARRAY类型的变量水果它是由[ '苹果', '橙', '芒果']组成,那么能够通过水果[1]来访问橙色。

    MAP:。MAP包括键 - >值键值对能够通过键来访问元素比方用户列表是一个映射类型(用户名当中是key.password是值),那么我们能够通过用户列表[用户名]来得到这个用户相应的密码..

    STRUCT:STRUCT能够包括不同数据类型的元素这些元素能够通过点的方式来得到,比方用户是一个STRUCT类型,那么能够通过user.address得到这个用户的地址。

    蜂巢表类型

    内部表

    内部表也称之为MANAGED_TABLE;默认存储在/用户/蜂巢/仓库下,也可以通过位置指定;删除表时,会删除表数据以及元数据;

    如果不存在则创建表...

    外部表

    外部表称之为EXTERNAL_TABLE在创建表时可以自己指定目录位置(LOCATION);删除表时,只会删除元数据不会删除表数据;

    如果不存在,创建EXTERNAL表...

    加载数据

    (1)HDFS上导入数据到Hive表:

    将路径'/home/wyp/add.txt'中的数据加载到表wyp中;

    (2)从本地路径导入数据到Hive表

    将数据本地路径'wyp.txt'加载到表wyp中;

    (3)从别的表查询加载到蜂巢表

    静态分区

    插入表测试分区(age = '25')从wyp中选择id,name,tel;

    动态分区

    set hive.exec.dynamic.partition = true; 

    set hive.exec.dynamic.partition.mode = nonstrict; 

    insert overwrite table test PARTITION(age)从wyp中选择id,name,tel,age;

    插入表和插入覆盖表的区别:后者会覆盖相应数据目录下的数据将。

    创建相似表

    create table table_name like other_table_name location“xxxxx”

    查询数据输出到本地目录

    INSERT OVERWRITE DIRECTORY'/ tmp / hdfs_out'SELECT a。* FROM邀请WHERE a.ds ='“;

    select by from emp deptno by empno asc;

    cluster by =由和相分配。

    Hive UDF编程

    UDF实现

    编程步骤:

    1,继承org.apache.hadoop.hive.ql.UDF

    2,需要实现评估函数; 评价函数支持重载;

    注意事项:

    1,UDF必须要有返回类型,可以返回null,但是返回类型不能为void;

    2,UDF中常用Text / LongWritable等类型,不推荐使用java类型;

    官网演示:https://cwiki.apache.org/confluence/display/Hive/HivePlugins

    使用UDF非常简单,只需要继承org.apache.hadoop.hive.ql.exec.UDF,并定义public Object evaluate(Object args){}方法即可。

    比如,下面的UDF函数实现了对一个字符串类型的字符串取HashMD5:

    包com.lxw1234.hive.udf;

    import org.apache.hadoop.hbase.util.Bytes; 

    import org.apache.hadoop.hbase.util.MD5Hash; 

    import org.apache.hadoop.hive.ql.exec.UDF;

    公共类HashMd5扩展UDF { 

    public String evaluate(String cookie){ 

    return MD5Hash.getMD5AsHex(Bytes.toBytes(cookie)); 

    }

    将上面的HashMd5类打成JAR包,udf.jar

    使用时候,在蜂巢命令行执行:

    hive> add jar file:///tmp/udf.jar ; 

    hive>将临时函数str_md5创建为'com.lxw1234.hive.udf.HashMd5'; 

    hive>从dual中选择str_md5('lxw1234.com');

    转变

    蜂房中的变换:使用脚本完成的Map / Reduce。

    hive>添加文件'python文件路径'

    hive>添加文件'python文件路径' 

    hive>选择

    TRANSFORM(p.joint_attr_values,p.collect_product_id,p.released_id)

    使用'python split_product_attrs.py' 

    作为(custom_attr,custom_attr_value ,collect_product_id,released_product_id)

    来自

    (这里应该是另外一个select语句,用于Transform的输入,最好是一一对应的,否则会出错)

    下面是蟒的脚本,用于将三列转换为四列,这里就比较简单了,主要用于测试,代码随便写了一下

    #!/ usr / bin / python 

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

    import sys 

    import datetime 

    #“规格:RN1-10 / 50;规格:RN1-10 / 50;规格:RN1-10 / 50 “ 

    #[”规格:RN1-10 / 51;规格:RN1-10 / 52;规格:RN1-10 / 53“,”11“,”22“] 

    #[”规格“,”RN1-10 / 51“ ,

    '11 ','22'] #[“规格”,“RN1-10 / 52”,'11','22'] 

    #[“规格”,“RN1-10 / 53”,'11',' 22'] 

    for sys.stdin中的行:

    values = line.split('\ t')

    values = [i中的i的i.strip()] 

    tmp = values [0] 

    key_values = tmp.split(“;”)

    对于key_values中的kv:

    k = kv.split(“:”)[0] 

    v = kv.split(“:”)[1] 

    print'\ t'。join([k,v,values [1],values [2]])

    蜂巢企业优化方案

    蜂巢存储格式

    1,TEXTFILE默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。只有TEXTFILE表能直接加载数据,本地载数据,和外部外部表直接加载运路径数据,都只能用TEXTFILE表。更深一步,蜂房默认支持的压缩文件(hadoop的默认支持的压缩格式),也只能用TEXTFILE表直接读取。其他格式不行。可以通过TEXTFILE表加载后插入到其他表中。

    2. orc格式。作为ORC存储;

    3.parquet格式。存储为PARQUET;

    几种格式的差别http://www.cnblogs.com/juncaoit/p/6067646.html

    蜂巢压缩优化

    压缩配置:

    map / reduce输出压缩(一般采用序列化文件存储)

    设置hive.exec.compress.output = true; 

    set mapred.output.compression.codec = org.apache.hadoop.io.compress.GzipCodec; 

    set mapred.output.compression.type = BLOCK;

    任务中间压缩

    set hive.exec.compress.intermediate = true; 

    set hive.intermediate.compression.codec = org.apache.hadoop.io.compress.SnappyCodec;(常用)

    set hive.intermediate.compression.type = BLOCK;

    中间压缩

    中间压缩就是处理作业映射任务和减少任务之间的数据,对于中间压缩,最好选择一个节省CPU耗时的压缩方式

    hive.exec.compress.intermediate  

    true  

    </ property>

    hadoop压缩有一个默认的压缩格式,当然可以通过修改mapred.map.output.compression.codec属性,使用新的压缩格式,这个变量可以在mapred-site.xml中设置或者在hive-site.xml文件。 SnappyCodec是一个较好的压缩格式,CPU消耗较低。

    mapred.map.output.compression.codec  

    org.apache.hadoop.io.compress.SnappyCodec  

    </ property>

    hive压缩文档https://yq.aliyun.com/articles/60859

    MapReduce的中使用压缩

    Hive中使用压缩

    Hive数据倾斜解决方案

    小表join大表大表join大表方案

    普通/随机/减少加入

    普通mapreduce join,相同键分配到同一个reducer。

    地图加入

    MAPJION会把小表全部读入内存中,在地图阶段直接拿另外一个表的数据和内存中表数据做匹配,适用于小表加入大表。

    原来的SQL可以通过使用提示的方式指定加入时使用mapjoin

    选择/ * + mapjoin(t1)* / t1.a,t1.b从表t1加入table2 t2 on(t1.a = t2.a和f.ftime = 20110802)

    Map加入Java实现

    http://www.cnblogs.com/ivanny/p/mapreduce_join.html

    SMB加入(排序合并桶加入)

    分区,桶,排序合并桶加入https://my.oschina.net/leejun2005/blog/178631

    使用SMB加入需要如下配置

    set hive.auto.convert.sortmerge.join = true; 

    set hive.optimize.bucketmapjoin = true; 

    set hive.optimize.bucketmapjoin.sortedmerge = true;

    结语

    为了帮助大家让学习变得轻松、高效,给大家免费分享一大批资料,帮助大家在成为大数据工程师,乃至架构师的路上披荆斩棘。在这里给大家推荐一个大数据学习交流圈:

    658558542   

    欢迎大家进群交流讨论,学习交流,共同进步。

    当真正开始学习的时候难免不知道从哪入手,导致效率低下影响继续学习的信心。

    但最重要的是不知道哪些技术需要重点掌握,学习时频繁踩坑,最终浪费大量时间,所以有有效资源还是很有必要的。

    最后祝福所有遇到瓶疾且不知道怎么办的大数据程序员们,祝福大家在往后的工作与面试中一切顺利。

    相关文章

      网友评论

        本文标题:大数据初学者福利:Hive基本使用教程

        本文链接:https://www.haomeiwen.com/subject/cflnrqtx.html