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

  • 相关阅读:
    SpringBoot实现原理
    常见Http状态码大全
    forward(转发)和redirect(重定向)有什么区别
    1094. Car Pooling (M)
    0980. Unique Paths III (H)
    1291. Sequential Digits (M)
    0121. Best Time to Buy and Sell Stock (E)
    1041. Robot Bounded In Circle (M)
    0421. Maximum XOR of Two Numbers in an Array (M)
    0216. Combination Sum III (M)
  • 原文地址:https://www.cnblogs.com/wadeyu/p/9784590.html
Copyright © 2011-2022 走看看