zoukankan      html  css  js  c++  java
  • 使用 Hive装载数据的几种方式

    装载数据
    1、以LOAD的方式装载数据
    LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION(partcol1=val1, partcol2=val2 ...)]
    1) 使用LOCAL这个关键字,那么这个路径应该为本地文件系统路径,是拷贝本地数据到位于HDFS上的目标位置,而不使用LOCAL这个关键字,那么这个路径应该为HDFS中的路径,是把本身就在HDFS上的数据转移到目标位置。 同时,因为文件是以这种方式移动的,Hive要求源文件和目标文件以及目录应该在同一个文件系统中,不可以使用LOAD DATA 语句将数据从一个集群的HDFS中转移到另一个集群的HDFS中。
    2) 如果使用OVERWRITE 关键字,那么目标文件夹中之前存在的数据将会删除,如果没有这个关键字,而目标文件夹中已经存在同名的文件时,会保留之前的文件并且会重新命名新文件为“之前的文件名_序列号”(这是在Hive v0.9.0版本中修复的,之前的版本是有同名的文件会被覆盖重写)。
    3) 如果目标表是分区表那么需要使用PARTITION 的子句,而且还必须为每个分区的键指定一个值。
    4) 对于 INPATH 子句使用的文件路径不可以包含任何文件夹。
    5) Hive不会验证装载的数据和表的模式是否匹配,而会验证文件格式是否和表结构定义的一致。如,表创建时定义的存储格式是sequencefile,那么转载进去的文件也应该是sequencefile 格式的文件。
     
    2、通过SELECT 语句向表中插入数据
    insert overwrite table user_install_status2 partition (dt='20141117')
    select aid,pkgname,uptime,type,country,gpcategory from
    user_install_status
    where dt='20141117';
    1)使用了OVERWRITE 关键字,因此之前分区的内容将会被覆盖掉。而不使用OVERWRITE 或者使用INTO替换掉OVERWRITE 的话,那么Hive将会以追加的方式写入数据(这是在Hive v0.8.0版本才有的)。
    2) 如果分区特别的多会多次扫描表进行插入数据,非常耗费资源。可以用下面的方式只扫描一次表就把所有的分区的数据进行插入。
    FORM user_install_status
    insert overwrite table user_install_status2 partition (dt='20141117')
    select aid,pkgname,uptime,type,country,gpcategory where dt='20141117'
    insert overwrite table user_install_status2 partition (dt='20141118')
    select aid,pkgname,uptime,type,country,gpcategory where dt='20141118'
    insert overwrite table user_install_status2 partition (dt='20141119')
    select aid,pkgname,uptime,type,country,gpcategory where dt='20141119'
    insert overwrite table user_install_status2 partition (dt='20141120')
    select aid,pkgname,uptime,type,country,gpcategory where dt='20141120';
     
    3、动态分区插入
    insert overwrite table user_install_status2 partition (dt)
    select ....., dt
    from user_install_status ;
    1)Hive 是根据SELECT 语句的最后一列来确定分区字段dt 的值。
    2)动态分区默认情况下没有开启,要通过设置如下两个参数来开启
    set hive.exec.dynamic.partition=true; 开启动态分区
    set hive.exec.dynamic.partition.mode=nonstrict;设为非严格模式执行,严格模式要求至少一个分区字段是静态的
     
    4、单个查询语句中创建表并加载数据
    create table user_install_status3 as
    select aid, pkgname, uptime, type, country, gpcategory
    from user_install_status
    where dt='20141228';
    1) 这种做法往往是从一个大的数据集中抽取一个小的数据集。
    2)这种做法不能用于外部表。
  • 相关阅读:
    stm32的hal之串口库函数总结复习
    关闭win10 任务栏窗口预览的步骤:
    sizeof的注意点
    goto语句——慎用,但是可以用
    #define的一个小技巧
    Chapter 1 First Sight——36
    Chapter 1 First Sight——35
    Chapter 1 First Sight——34
    leetcode409
    Chapter 1 First Sight——34
  • 原文地址:https://www.cnblogs.com/sunrise88/p/6940334.html
Copyright © 2011-2022 走看看