data hive load 使用目录 hive load data inpath_hive编程指南

上一篇说的是外部表,当把EXTERNAL关键字去掉的时候就是内部表了。为什么叫内部表,因为这种表,Hive会(或多或少地)控制着数据的生命周期。

如果你熟悉Hive那你一定知道,Hive默认情况下会将这些表的数据存储在由配置项 hive.metastore.warehouse.dir (例如,/user/hive/warehouse)所定义的目录的子目录下。

当我们删除一个内部表时,Hive也会删除这个表中数据。相应的,内部表不方便和其他工作共享数据。例如,有一份数据正在被其他程序使用,同时我们还想使用Hive在这份数据上执行一些查询,可是并没有给予Hive对数据的所有权,我们可以创建一个外部表指向这份数据,而并不需要对其具有所有权。那内部表如果想要这份数据怎么办呢,用LOAD。

LOAD DATA LOCAL INPATH /data/ OVERWRITE INTO TABLE ods_login PARTITION (dt='2020-03-01');
  • OVERWRITE:覆盖

如果用户指定了 OVERWRITE关键字,那么目标文件夹中之前存在的数据将会被先删 除掉。如果没有这个关键字,仅仅会把新增的文件增加到目标文件夹中而不会删除之 前的数据。如果目标文件夹中已经存在和装载的文件同名的文件,那么旧的同 名文件将会被覆盖重写。

  • PARTITION:导入分区

如果分区目录不存在的话,这个命令会先创建分区目录,然后再将数据拷贝到该目录下。如果目标表是非分区表,那么语句中应该省略PARTITION子句。

通常情况下指定的路径应该是一个目录,而不是单个独立的文件。Hive会将所有文件 都拷贝到这个目录中。这使得用户将更方便地组织数据到多文件中,同时,在不修改 Hive脚本的前提下修改文件命名规则。不管怎么样,文件都会被拷贝到目标表路径下 而且文件名会保持不变。

如果使用了 LOCAL这个关键字,那么这个路径应该为本地文件系统路径。数据将会被 拷贝到目标位置。如果省略掉LOCAL关键字,那么这个路径应该是HDFS的路径。这种情况下,数据是从这个路径转移到目标位置的。

上一篇提到过Hive的schema on read,这种模式的优势是load data 非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。Mysql的写时模式的优势是提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费要多的加载时间。

需要注意的是:

  • 如果加载的文件在HDFS上,此文件会被移动到表路径中;
  • 如果加载的文件在本地,此文件会被复制到HDFS的表路径中;
  • 会为每一个待导入的文件,启动一个MR任务进行导入。

如同内部表一样,外部表在创建表时也需要指定数据表所在的数据文件的路径——以下简称为表路径。如果没有指定,Hive会自动分配一个。自动分配的目录是hive主目录下的以表名命名目录;

如果创建外部表时,指定表的数据存储目录。Hive会将此目录下已有的所有文件作为表的数据文件,在查询时进行解析。此时,Hive仍会在hive的目录下创建以表名命名的目录,但目录内的内容为空。

参考资料:

1.《Hive编程指南》 

2. Hive官方wiki:

https://cwiki.apache.org/confluence/display/HIVE


>>  想学大数据?点击找老蒙!<<

智能人工推荐: 从面试官的角度谈谈大数据面试  

data hive load 使用目录 hive load data inpath_hive load data外部表报错_02

你是否能被轻易地取代?


>>  点击查看更多 觉得有价值请关注  ▼

data hive load 使用目录 hive load data inpath_hive load data外部表报错_03