• Hive[5] HiveQL 数据操作


    5.1 向管理表中装载数据  
    Hive 没有行级别的数据插入更新和删除操作,那么往表中装载数据的唯一途径就是使用一种“大量”的数据装载操作,或者通过其他方式仅仅将文件写入到正确的目录下;
     
    LOAD DATA LOCAL INPATH '${env:HOME}/califonia-employees'
    OVERWRITE INOT TABLE employees  
    PARTITON (country=''US, state='CA') ;  
    向管理表中装载数据,如果目录不存在的话, overwrite 会先创建分区目录,然后再将数据拷贝到该目录 ;如果是非分区表则应该省略 partition 后面的语句;
    通常情况下指定的路径应该是一个目录,而不是一个单个独立的文件,Hive 会将所有的文件都拷贝到这个目录中;
    INPATH 子句中使用的文件路径还有一个限制,就是这个路径下可能 包含任何文件夹;
     
    注意:如果使用了 LOCAL 关键字,这个路径应该为本地文件系统路径,数据将会被拷贝骊目标位置,如果省略掉 LOCAL关键字,那这个路径应该是分布式文件系统中的路径,这咱情况数据是从这个路径转移到目标位置;
    LOAD DATA LOCAL 。。。 拷贝本地数据到位于分布式文件系统上的目标位置;
    LOAD DATA 。。。转移数据到目标位置;
     
    注意:Hive 要求源文件和目标文件以及目录应该在同个文件系统中,用户不可以使用 LOCAL DATA 语句将数据从一个集群的 HDFS 中转移 到另一个集群的 HDFS 中;
    指定全路径会具有更好的鲁棒性,但也同样支持相驿路径,当使用本地模式执行时,相对路径相对的是当 Hive CLI 启动时用户的工作目录,对于分布式或者伪分布式模式,这个路径解读为相对于分布式文件系统中用户的根目录,该目录在 HDFS 和 MapRFS中默认为 /user/$USER;
    如果用户指定了 OVERWRITE 关键字,那么目标文件夹中之前存在的数据将会被先删除掉,如果没有,仅仅会把新增的文件增加到目标文件夹中而不会删除之前的数据。如果目标文件夹中的文件已经存在和装载的文件同名的文件,那么旧的同名文件将会被覆盖重写;
     
    如果目录是分区表,那么需要使用 PARTITON 子句,而且用户还必须为每个分区的键指定一个值 ;
    Hive 并不会验证用户装载的数据和表的模式是否匹配,但会验证文件格式是否和表结构定义的一致;(如存储格式为 SEQUENCEFILE V,那么装载进去的格式也必须为这种)

    5.2 通过查询语句向表中插入数据
    insert overwrite table employees partition(country='us',state='or')
    select * from staged_employees se where se.cnty='us' and se.st='or'
    OVERWRITE 关键字会将以前分区之中的内容覆盖掉,如果改成 INOT 则会以追加的方式写入数据;(0.8.0以后的版本才有)
     
    FROM staged_employees se
    INSERT OVERWRITE TABLE employees
        PATRITION(country='us',state='or')
        SELECT * WHERE se.cnty='us' AND se.st='or'
    INSERT OVERWRITE TABLE employees
        PATRITION(country='us',state='ca')
        SELECT * WHERE se.cnty='us' AND se.st='ca'
    INSERT OVERWRITE TABLE employees
        PATRITION(country='us',state='il')
        SELECT * WHERE se.cnty='us' AND se.st='il'
    以上语句可以只扫描一次表 staged_employees 就可以做多次插入其他表
     
    动态分区插入
    INSERT OVERWRITE TABLE employees
    PARTITION(country,state)
    SELECT ...,se.cnty,  se.st
    FROM staged_employees se;
    Hive 会根据 SELECT 语句中最后2列来确定分区字段 counrty 和 state 的值
     
    INSERT OVERWRITE TABLE employees PARTITION (country='us',state)
    SELECT ..., se.cnty,se.st FROM staged_employees se WHERE se.cnty='us'
    静态+动态分区联合使用
    【注意:静态分区必须出现在动态分区之前,而且动态分区默认情况下是没有开启的,开启后默认是以“严格”模式执行的,在这种模式下要求至少有一列分区字段是静态的,这有助于阻止因设计错误导致查询产生大量的分区】
     
    动态分区属性 【可以用 set 属性=值  来进行设置】 属性    默认值     说明 
    hive.exec.dynamic.partition    false     设置成 true 表示开启动态分区功能
    hive.exec.dynamic.partition.mode    strict    设置成 nonstrict 表示允许所有分区都是动态的
    hive.exec.max.dynamic.partitions.pernode    100    每个 mapper 或 reducer 可以创建的最大动态分区个数
    hive.exec.max.dynamic.partitions    +1000    一个动态分区创建语句可以创建的最大动态分区个数,如果超过出报错
    hive.exec.max.created.files     100000    全局可以最大文件个数,如果超过会报错
     
    5.3 单个查询语句中创建表并加载数据 【本功能不能使用于外部表】
    CREATE TABLE ca_employees AS SELECT name,salary,address FROM employees WHERE se.state='ca' ;
     
    5.4 导出数据
    hadoop fs -cp source_path target_path 直接用 hadopp 命令导出语句
     
    INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'    --最后面的路径也可以写成 URL 路径(hdfs://master-server/tmp/ca_employees)
    SELECT name, salary, address FROM employees WHERE se.state ='ca';  一个或多个文件将会被保存到 /tmp/ca_employees 目录下,不管Hive 表中数据实际是怎么存储的,Hive 会将所有的字段序列化成字符串写入到文件中,Hive 会使用和 Hive 内部存储的表相同的编码方式来生成输出文件。
    hive> ! ls /tmp/ca_employees;  在hive里执行bash命令查看文件
     
    用户也可以和向表中插入数据一样,通过以下方式指定多个输出文件夹目录:
    FROM staged_employees se
    INSERT OVERWRITE directory '/tmp/or_employees'
        PATRITION(country='us',state='or')
        SELECT * WHERE se.cnty='us' AND se.st='or'
    INSERT OVERWRITE directory '/tmp/ca_employees'
        PATRITION(country='us',state='ca')
        SELECT * WHERE se.cnty='us' AND se.st='ca'
    INSERT OVERWRITE directory '/tmp/il_employees'
        PATRITION(country='us',state='il')
        SELECT * WHERE se.cnty='us' AND se.st='il'
  • 相关阅读:
    JavaScript
    94.Binary Tree Inorder Traversal
    144.Binary Tree Preorder Traversal
    106.Construct Binary Tree from Inorder and Postorder Traversal
    105.Construct Binary Tree from Preorder and Inorder Traversal
    90.Subsets II
    78.Subsets
    83.Merge Sorted Array
    80.Remove Duplicates from Sorted Array II
    79.Word Search
  • 原文地址:https://www.cnblogs.com/jiuyi/p/4222805.html
Copyright © 2020-2023  润新知