zoukankan      html  css  js  c++  java
  • Hive之数据类型

    数字类

    类型 长度 备注
    TINYINT 1字节 有符号整型
    SMALLINT 2字节 有符号整型
    INT 4字节 有符号整型
    BIGINT 8字节 有符号整型
    FLOAT 4字节 有符号单精度浮点数
    DOUBLE 8字节 有符号双精度浮点数
    DECIMAL -- 可带小数的精确数字字符串

    日期时间类

    类型 长度 备注
    TIMESTAMP -- 时间戳,内容格式:yyyy-mm-dd hh:mm:ss[.f...]
    DATE -- 日期,内容格式:YYYY­MM­DD
    INTERVAL -- --

    字符串类

    类型 长度 备注
    STRING -- 字符串
    VARCHAR 字符数范围1 - 65535 长度不定字符串
    CHAR 最大的字符数:255 长度固定字符串

    Misc类

    类型 长度 备注
    BOOLEAN -- 布尔类型 TRUE/FALSE
    BINARY -- 字节序列

    复合类

    类型 长度 备注
    ARRAY -- 包含同类型元素的数组,索引从0开始 ARRAY<data_type>
    MAP -- 字典 MAP<primitive_type, data_type>
    STRUCT -- 结构体 STRUCT<col_name : data_type [COMMENT col_comment], ...>
    UNIONTYPE -- 联合体 UNIONTYPE<data_type, data_type, ...>

    uniontype实践

    • uniontype可以理解为泛型
    • 同一时刻同一地点只有联合体中的一个元素生效
    • uniontype中的元素共享内存
    • 可以通过create_union内置函数创建uniontype:create_union(tag, val1, val2) tag是数字,0开始,必须小于后面参数的个数
    • 插入uniontype数据,通过这种方式只能插入只有一个元素的uniontype,包含多个会提示跟表中的字段类型不一致,这个是坑的地方
    CREATE TABLE union_test3(foo UNIONTYPE<map<string, string>>)
    
    insert into table union_test3 select * from (select create_union(0,map('name', 'tom', 'name2', 'wadeyu')))t;
    
    • 默认tag和数据使用B分隔,列数据使用C分隔,map中key和value使用D分隔(B ascii码 2,^C ascii码 3,^D ascii码 4,分隔符是通过vim查看到的【vim中输入这些特殊字符 ctrl + v + 相应的字母】)
    • 在uniontype字段中自定义分隔符的含义变了
    分隔代码 含义
    collection items terminated by ',' tag和数据之间使用英文逗号分隔
    map keys terminated by ':' 复合类型数据元素之间使用英文冒号分隔
    -- map中的key和value暂时没找到可以配置的代码
    • 操作
    # 创建表
    create table union_testnew(
      foo uniontype<int, double, string, array<string>, map<string, string>>
    )
    row format delimited
    collection items terminated by ','
    map keys terminated by ':'
    lines terminated by '
    '
    stored as textfile;
    
    # 数据准备
    [root@master wadeyu]# vim union_test.log 
      1 0,1
      2 1,3.0
      3 2,world
      4 3,wade:tom:polly
      5 4,k1^Dv1:k2^Dv2
      
    # 导入数据
    hive (badou)> load data local inpath './union_test.log' overwrite into table union_testnew;
    
    # 查询数据
    hive (badou)> select * from union_testnew;
    OK
    union_testnew.foo
    {0:1}
    {1:3.0}
    {2:"world"}
    {3:["wade","tom","polly"]}
    {4:{"k1":"v1","k2":"v2"}}
    Time taken: 0.225 seconds, Fetched: 5 row(s)
    
    • 碰到的问题 原因:数据格式没有按照要求
    18/10/11 19:06:24 [main]: WARN thrift.ThriftCLIService: Error fetching results: 
    org.apache.hive.service.cli.HiveSQLException: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.NumberFormatException: Empty string!
    	at org.apache.hive.service.cli.operation.SQLOperation.getNextRowSet(SQLOperation.java:352)
    	at org.apache.hive.service.cli.operation.OperationManager.getOperationNextRowSet(OperationManager.java:220)
    	at org.apache.hive.service.cli.session.HiveSessionImpl.fetchResults(HiveSessionImpl.java:685)
    	at org.apache.hive.service.cli.CLIService.fetchResults(CLIService.java:455)
    	at org.apache.hive.service.cli.thrift.ThriftCLIService.FetchResults(ThriftCLIService.java:674)
    

    参考资料

    【0】 Hive wiki - Tutorial
    https://cwiki.apache.org/confluence/display/Hive/Tutorial

    【1】 Hive wiki - LanguageManual Types
    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

    【2】特殊字符C(ETX)、B(STX)
    https://blog.csdn.net/liluotuo/article/details/43984071

    【3】详解hive的列分隔符和行分隔符的使用
    https://blog.csdn.net/qq_26442553/article/details/80297028

    【4】ASCII码表
    https://baike.baidu.com/item/ASCII/309296

    【5】HIVE Row Formats&SerDe(五)
    https://blog.csdn.net/mhtian2015/article/details/78899171

  • 相关阅读:
    好用的Win7下硬盘分区软件:Acronis Disk Director Suite
    SQL Server 相关create操作语句
    我也有博客了
    N层构架如何实现
    SQL相关增删改查语句
    1.MVC的工作流程
    回顾去年以来读过的书
    [Architecture]Facebook Chat
    [Tips]解决make_sock: could not bind to address 0.0.0.0:XXXX
    Emacs中的按键组合
  • 原文地址:https://www.cnblogs.com/wadeyu/p/9784590.html
Copyright © 2011-2022 走看看