zoukankan      html  css  js  c++  java
  • Hive学习小记-(4)带复杂集合类型及指定多分隔符hive建表

    带集合类型建表

    Hive上创建测试表test

    create table test(
    name string,
    friends array<string>,
    children map<string, int>,
    address struct<street:string, city:string>
    )
    row format delimited fields terminated by ','
    collection items terminated by '_'
    map keys terminated by ':'
    lines terminated by '
    ';
    -- 其中
    row format delimited fields terminated by ','  -- 列分隔符字段解释:
    collection items terminated by '_'   --MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)
    map keys terminated by ':' -- MAP中的key与value的分隔符
    lines terminated by '
    '; -- 行分隔符
    # 从本地上传文件
    hive (default)> load data local inpath ‘/opt/module/datas/test.txt’into table test
    -- 三种集合类型的数据,以下分别是ARRAY,MAP,STRUCT的访问方式
    hive (default)> select friends[1],children['xiao song'],address.city from test
    where name="songsong";
    
    OK
    _c0     _c1     city
    lili    18      beijing
    Time taken: 0.076 seconds, Fetched: 1 row(s)

     

    多分隔符建表

    create table test_toutiao(
         id string
        ,tag1 int
        ,tag2 string
        ,question string
        ,answer string
    ) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' 
    WITH SERDEPROPERTIES ("field.delim"="_!_");
    
    -- 这里WITH SERDEPROPERTIES 里面是不是少了一个encoding='UTF-8'或者'GBK'之类的参数?
    -- field.delim也可以写八进制ascii码,vim数据文件在NORMAL格式下输入ga可以查看ascii码,eg:"field.delim"="12428"

    附:hive建表规则

    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
    [(col_name data_type [COMMENT col_comment], ...)] 
    [COMMENT table_comment] 
    [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
    [CLUSTERED BY (col_name, col_name, ...) 
    [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
    [ROW FORMAT row_format] 
    [STORED AS file_format] 
    [LOCATION hdfs_path]
    [TBLPROPERTIES (property_name=property_value, ...)]
    [AS select_statement]
    2.字段解释说明 
    (1CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
    (2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
    (3)COMMENT:为表和列添加注释。
    (4)PARTITIONED BY创建分区表
    (5CLUSTERED BY创建分桶表
    (6)SORTED BY不常用,对桶中的一个或多个列另外排序
    (7)ROW FORMAT 
    DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
            [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] 
       | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
    用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
    SerDe是Serialize/Deserilize的简称, hive使用Serde进行行对象的序列与反序列化。
    (8)STORED AS指定存储文件类型
    常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
    如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
    (9)LOCATION :指定表在HDFS上的存储位置。
    (10AS:后跟查询语句,根据查询结果创建表。
    (11)LIKE允许用户复制现有的表结构,但是不复制数据

     

    TIPS:字符的ascii码

    字符常量可以是普通字符‘a’,'b'这样,也可以是转义字符 , 这种

    这些字符也都可以用ASCII码表示,即用反斜符()开头,后跟字符的ASCII码,这种方法也称为转义序列表示法,具体方法有两种形式:

    一种是用字符的八进制ASCII码,表示为:dd.这里,0dd是八进制值(0可以省略)。

    另一种使用字符的十六进制ASCII码值,表示为 xhh或Xhh 这里hh是两位十六进制值。

    如:'A' ,'101' 和 'x41'都表示同一个字符常量。

  • 相关阅读:
    快乐的深圳之旅
    编码和字体[zz]
    USB转串口芯片几点总结有疑问
    ANSI/UTF8/UCS2(UTF16),以及回车换行[zz]
    详细介绍四线电阻触摸屏的工作原理[zz]
    无字库12864液晶的驱动方法[zz]
    字符集和字符编码(Charset & Encoding)[zz]
    搭建CodeBlocks+wxWidgets可视化编程环境(Windows)
    wxWidgets初始化分析应用定义和初始化
    开发CodeBlocks插件(1)入门篇
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14193802.html
Copyright © 2011-2022 走看看