• (转)hive —— 数据类型


    原文:https://blog.csdn.net/qq_34132046/article/details/117600817

    hive —— 数据类型
    详细请看
    hive官方手册:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-TimestampstimestampTimestamps

    hive的数据类型有五大类型:

    primitive_type :原始类型
    array_type :数组
    map_type :map
    struct_type :结构体
    union_type :联合体
    一、primitive_type原始类型
    以下是hive的原始数据类型及格式

    类型 描述 示例
    TINYINT 一字节整数, -128 ~ 127 12
    SMALLINT 二字节整数,-32768 ~ 32767 255
    INT/INTEGER 4字节整数 -2,147,483,648 ~ 2,147,483,647 2555
    BIGINT 4字节整数,-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 -250 000 000 000
    FLOAT 4字节单精度小数 3.1415
    DOUBLE 8字节双精度小数 3.141529
    DECIMAL 任意数字 10
    STRING 字符串 “abc”
    VARCHAR 字符串,字符串长度只能为1~65355 “abc”
    CHAR 字符串,字符串长度只能为1~255 “abc”
    TIMESTAMP 时间戳,格式为yyyy-mm-dd HH:mm:ss 2019-2-28 13:25:25
    DATE 日期,格式为yyyy-mm-dd 2019-2-28
    BOOLEAN 布尔类型 TRUE/FALSE
    BINARY 字节序列
    DECIMAL
    这里我们对DECIMAL类型做两点说明:
    1)DECIMAL(9,8)代表最多9位数字,后8位是小数。此时也就是说,小数点前最多有1位数字,如果超过一位则会变成null。
    2)如果不指定参数,那么默认是DECIMAL(10,0),即没有小数位,此时0.82会变成1。

    注:大于 BIGINT 的整型文字必须使用 Decimal(38,0) 处理。
    例子:

    select CAST(18446744073709001000BD AS DECIMAL(38,0)) from my_table limit 1;
    1
    日期类型
    1、Timestamps 时间戳
    时间戳是数据库常用的存放日期的形式之一,表示从 UTC 时间’1970-01-01 00:00:00’开始到现在的秒数。

    2001-09-09 09:46:40 ~ 2286-11-21 01:46:40 之间的时间戳,都是10位数。

    因此,我们这个时代使用的时间戳一般都是10位。如果遇到13位的时间戳,则为毫秒数。

    时间戳

    当从文件中load数据到Timestamps类型时,文本文件中的时间戳必须使用:yyyy-mm-dd hh:mm:ss[.f…] 格式,不然数据会变成NULL。精度只能到纳秒,即yyyy-mm-dd hh:mm:ss.ssssss,
    小数点后六位,超过纳秒也会变成NULL。

    hive支持从以下类型转换成Timestamps类型:
    CAST(<timestamp/date> AS <varchar/char/string> [FORMAT < template>])
    CAST(<varchar/char/string> AS <timestamp/date> [FORMAT < template>])

    整数数字类型:解释为以秒为单位的 UNIX 时间戳
    浮点数字类型:解释为具有十进制精度的 UNIX 时间戳(以秒为单位)
    字符串:符合 JDBC 的 java.sql.Timestamp 格式“YYYY-MM-DD HH:MM:SS.ffffffffff”(9 位小数精度)

    还有hive自带的udf转换:
    1、String to Timestamps:
    unix_timestamps(string date, string format)
    注:如果format为空,date的格式必须为yyyy-MM-dd HH:mm:ss。

    2、Timestamps to String:
    from_timestamps(int/bigint timestamp ,string format)
    注:前面的int/bigint最大只能是10位数,即到秒。如果是13位(毫秒),则需/1000,或者将前面10位分割出来再转换。

    2、date类型
    DATE 值描述了特定的年/月/日,格式为 YYYY-MM-DD。 例如,日期“2013-01-01”。 日期类型没有时间组件。 Date 类型支持的值范围是 0000-01-01 到 9999-12-31,这取决于原始 Java Date 类型的支持。

    转换函数:

    cast(date as timestamp) 基于本地时区,生成对应于日期值的年/月/日的午夜的时间戳值。
    cast(string as date) 如果字符串的格式为“YYYY-MM-DD”,则返回对应于该年/月/日的日期值。如果字符串值与此格式不匹配,则返回 NULL。
    cast(date as date) 相同的日期值
    cast(timestamp as date) 时间戳的年/月/日是根据本地时区确定的,并作为日期值返回。
    cast(date as string) 日期表示的年/月/日被格式化为“YYYY-MM-DD”形式的字符串。
    二、array_type 数组类型
    格式:ARRAY(数据类型)
    要配合:collection items terminated by ‘分割符’;

    例如:

    --数据: a,d:e: f,g

    create table [if no exists] example1
    (
    Field1 VARCHAR,
    Field2 ARRAY(VARCHAR),
    Field3 VARCHAR
    )
    row format delimited fields terminated by ',' --定义字段间的分割符
    collection items terminated by ':' --定义数组数据间的分割符

    --查询
    select Field1,Field2[0] from example1 ;

    select Field1,Field2 from example1 where array_contains(Field2 ,'d');

    select Field1,size(Field2) from example1 ;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    三、map_type 字典类型
    格式:map< 原始数据类型,数据类型 >
    要配合:collection items terminated by ‘分割符’ 和map keys terminated by '分割符’

    例如:

    --数据: a,d:d1;e:e1;f:f1,g

    create table [if no exists] example2
    (
    Field1 VARCHAR,
    Field2 MAP(VARCHAR,VARCHAR),
    Field3 VARCHAR
    )
    row format delimited fields terminated by ',' --定义字段间的分割符
    collection items terminated by ';' --定义集合间的分割符
    map keys terminated by ':' --定义key value之间的分割符
    --查询
    -- 取map字段的指定key的值
    select Field1,Field2['d'] as father from example2 ;
    -- 取map字段的所有key
    -- 得到的是数组
    select Field1,map_keys(Field2) as relation from example2 ;
    -- 取map字段的所有value
    -- 得到的是数组
    select Field1,map_values(Field2) from example2 ;

    select Field1,tmp
    from
    (select id,name,Field2['d'] as tmp from t_person) example2
    where tmp is not null;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    四 struct_type 结构体
    格式:struct<名字:数据类型,名字:数据类型,…>
    配合:collection items terminated by '分割符’

    例如

    1,zhangsan,18:male:beijing
    2,lisi,28:female:shanghai

    create table t_person_struct(id int,name string,info struct<age:int,sex:string,addr:string>)
    row format delimited fields terminated by ','
    collection items terminated by ':';

    select id,name,info.age from t_person_struct;
    1
    2
    3
    4
    5
    6
    7
    8
    五、union_type
    uniontype可以理解为泛型
    同一时刻同一地点只有联合体中的一个元素生效
    uniontype中的元素共享内存
    可以通过create_union内置函数创建uniontype:create_union(tag, val1, val2) tag是数字,0开始,必须小于后面参数的个数
    插入uniontype数据,通过这种方式只能插入只有一个元素的uniontype,包含多个会提示跟表中的字段类型不一致,这个是坑的地方
    默认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 '\n'
    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)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    六、数据类型的转换
    ————————————————
    版权声明:本文为CSDN博主「奋力追赶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_34132046/article/details/117600817

  • 相关阅读:
    Centos7防火墙
    MySql按日期进行统计
    MySQL配置文件详解
    MySQL查看和修改表的存储引擎
    计算文件词频
    MapReduce寻找共同好友
    Centos 7 安装 memcached
    Linux常用命令(二)--文件目录命令
    Linux常用命令(一)--系统命令
    python学习笔记:(八)条件语句
  • 原文地址:https://www.cnblogs.com/liujiacai/p/16848836.html
Copyright © 2020-2023  润新知