最近在做一个小任务,将一个CDH平台中Hive的部分数据同步到另一个平台中。毕竟我也刚开始工作,在正式开始做之前,首先进行了一段时间的练习,下面的内容就是练习时写的文档中的内容。如果哪里有错误或者疏漏,希望各位网友能够指出。

第一篇:HDFS的上传与下载(put & get):https://www.cnblogs.com/BlackString/p/10552553.html

第三篇:Hive分区表的导入与导出:https://www.cnblogs.com/BlackString/p/10552901.html

第四篇:跨平台传输方案:https://www.cnblogs.com/BlackString/p/10553010.html

Hive数据的上传/导入

1. 前言

​ 上一篇中,我们尝试了向HDFS中上传及下载文件的测试。在本篇,我们尝试从Hive中导出/导入数据。

2. Hive中的数据

  Hive中表数据对应着HDFS中的warehouse目录中的文件。其中:

​  一个数据库对应一个.db文件;

​   一个表对应.db文件中的一个文件夹;

​   表中的每个分区对应着表文件夹中的一个文件夹;

​   表中的每个桶对应着每个分区文件夹中的一个文件;

  检查Hive,发现Hive中有5个表:

    shell
    hive> show databases;
    db_zh_dw
    db_zh_dw2
    default
    test
    test02

  查看HDFS中的 /user/hive/warehouse 目录,在其中发现了以下文件:

    drwxrwxrwt - admin hive /user/hive/warehouse/db_zh_dw.db
    drwxrwxrwt - admin hive /user/hive/warehouse/test.db
    drwxrwxrwt - root hive /user/hive/warehouse/test02.db

  我们以test数据库为例,查看test中的表及test.db文件中的内容:

    hive> show tables;
    aos_dic
    aos_role
    aosparams

  ————————————————————————————————

    [root@DataCenter2 ~]# hadoop fs -ls /user/hive/warehouse/test.db
    drwxrwxrwt - hdfs hive /user/hive/warehouse/test.db/aos_dic
    drwxrwxrwt - hdfs hive /user/hive/warehouse/test.db/aos_role
    drwxrwxrwt - hdfs hive /user/hive/warehouse/test.db/aosparams

  从上可见,每个数据表对应着test.db中的一个文件夹。以aos_dic.db表为例,让我们查看其中的数据:

    [root@DataCenter2 ~]# hadoop fs -ls /user/hive/warehouse/test.db/aos_dic;
    -rwxrwxrwt 3 hdfs hive 1588 2018-09-21 14:13 /user/hive/warehouse/test.db/aos_dic/part-m-00000
    -rwxrwxrwt 3 hdfs hive 663 2018-09-21 14:13 /user/hive/warehouse/test.db/aos_dic/part-m-00001
    -rwxrwxrwt 3 hdfs hive 2019 2018-09-21 14:13 /user/hive/warehouse/test.db/aos_dic/part-m-00002
    -rwxrwxrwt 3 hdfs hive 254 2018-09-21 14:13 /user/hive/warehouse/test.db/aos_dic/part-m-00003

  可以看到该表中有四个文件(事实上,这四个表中就存储了aos_dic表中的所有数据,即该表不是一个分区表)。让我们查看该表的创建语句,其中有:

    LOCATION 'hdfs://DataCenter3:8020/user/hive/warehouse/test.db/aos_dic'

  这意味着该表是一个外部表。那么,假如我们向aos_dic中上传新文件,aos_dic表中的数据行是否会增多?

3. 向Hive中上传新文件

  1)还是拿test库下的aos_dic表为例。此时此表中的数据行有:

    hive> select count(*) from aos_dic;
    80

    此时aos_dic表中有80行数据。

  2)我们仿照aos_dic中的文件创建一个新文件:part-m-00004,并在其中写入符合格式的10行数据,然后将该文件上传到aos_dic文件夹下:

    sudo -u hdfs hadoop fs -put part-m-00004 /user/hive/warehouse/test.db/aos_dic

  3)上传完毕,到hive中查看aos_dic表中的数据是否增多:

    hive> select count(*) from aos_dic;
    90

  4)由上可见,我们上传的数据也出现在了aos_dic表中。

4. hive export 和 hive import 的使用

  Export命令可以导出一张表或分区的数据和元数据信息到一个输出位置,并且导出数据可以被移动到另一个hadoop集群或hive实例,并且可以通过import命令导入数据。

  当导出一个分区表,原始数据可能在hdfs的不同位置,export/import命令也支持导出分区表的不同子分区。

  导出的元数据存储在目标目录,并且数据文件是存储在不同的子目录下。

  Export/import命令可以独立工作在使用存储元数据的rdbms中。

  语法

    1)export语法:

      EXPORT TABLE tablename [PARTITION (part_column="value"[, ...])]
      TO 'export_target_path' [ FOR replication('eventid') ]

    2)import语法:

      IMPORT [[EXTERNAL] TABLE new_or_original_tablename [PARTITION (part_column="value"[, ...])]]
      FROM 'source_path'
      [LOCATION 'import_target_path']

  练习

    1)导出练习:

    将test02库中的tt03表(非分区表,外部表)导出到 /user/test 下(也可以不用新建文件夹,导出时会自动创建):

      export table tt03 to '/user/test';

    到 /user/test 下查看,会发现多出了两个新文件。从下面的结果中可以看出,两个文件中,一个保留了tt03表的元数据信息,一个存储了tt03的外部数据文件:

      [root@DataCenter2 tt02]# hadoop fs -ls /user/test
      -rwxr-xr-x 3 root supergroup 1392 2019-03-15 14:30 /user/test/_metadata
      drwxr-xr-x - root supergroup 0 2019-03-15 14:30 /user/test/data
      [root@DataCenter2 tt02]# hadoop fs -ls /user/test/data
      -rwxr-xr-x 3 root supergroup 132 2019-03-15 14:30 /user/test/data/part01.txt
      -rwxr-xr-x 3 root supergroup 142 2019-03-15 14:30 /user/test/data/part02.txt
      -rwxr-xr-x 3 root supergroup 141 2019-03-15 14:30 /user/test/data/part03.txt

      ————————————————————————————————————

      [root@DataCenter2 tt02]# hadoop fs -cat /user/test/_metadata
      元数据略;

2)导入练习:

  将1)中导出的信息导入到test03库中:

    hive> import from '/user/test';

  导入成功,会发现test03下多出了一个表tt03:

    hive> show tables;
    tt03

  查看tt03中的数据,发现和test02库中的tt03表一致。

  而到tt03在HDFS中的文件查看,会发现test03库下多出了一个文件夹tt03,而tt03中包含了原tt03的所有外部文件:

    [root@DataCenter2 tt02]# hadoop fs -ls /user/hive/warehouse/test03.db/tt03
    -rwxrwxrwt 3 root supergroup 132 2019-03-15 14:31 /user/hive/warehouse/test03.db/tt03/part01.txt
    -rwxrwxrwt 3 root supergroup 142 2019-03-15 14:31 /user/hive/warehouse/test03.db/tt03/part02.txt
    -rwxrwxrwt 3 root supergroup 141 2019-03-15 14:31 /user/hive/warehouse/test03.db/tt03/part03.txt

  除了直接导入原表外,还可以在导入时重命名导入的表:

    hive> import table tt02 from '/user/test';

3)关于内外部表,import后的不同:

  一个内部表的信息,被导入后仍然是一个内部表,在hive中删除该表,对应的库中的文件也会被删除;

  一个外部表的信息,被导入后仍然是一个外部表,在hive中删除该表,对应库中的文件不会被删除;

  但是,一个内部表的信息在导入时可以被导入为一个外部表:

    hive> import external table tt01 from '/user/test/test01';

  到该表所在的数据库中查看,会发现.db文件下多出了一个文件夹tt01,但是其中没有任何数据,此时删除该表这个文件夹也不会消失。

  向导入的表tt01中插入数据,插入成功后去查看.db下出现的tt01文件夹,会发现它仍然是一个空文件夹,到导入数据所在的文件夹下,会发现多出了一条新数据——正是我们刚刚插入的那条数据。

4)指定导入位置:

  在导入一个表时,我们可以指定这个表导入的位置,如:

    hive> import from '/user/test/test01' location '/user/test/test02';

  查看该表,发现其中包含了所有的数据。如果此时去test03.db下查看,会发现并不存在名为tt01的文件夹。在这条指令中,我们在 /user/test 下新建了一个test02文件夹,并在导入时定位到了这里。此时,我们到该文件夹下

  查看,会发现其中包含了tt01的所有数据。

  向tt01中插入一条新数据,.db下并没有出现新文件,到test02文件夹下查看,会发现新增了一个文件,其中记录了新插入的数据。

  删除test02文件夹,会发现test03库中tt01仍然存在,但是却不含任何数据。向其中插入一条新数据,会发现 /user/test 下重新出现了test02文件夹,其中包含了刚刚插入的那条数据。

5)导入/导出分区:

  那么,对于分区表要如何导出/导入呢?

  使用以下语句导出一个分区表的某个分区:

    hive> export table tt02 partition(birth='1997') to '/user/test/test03';

  使用以下语句导入一个分区表:

    hive> import table tt02 partition(birth='1997') from '/user/test/test03';

  会发现已经导入了一个分区表,这个分区表中包含了一个分区。当然我们也可以导入更多的分区:

    hive> import table tt02 partition(birth='1999') from '/user/test/test04';

  成功后会发现该表又多处一个新的分区。到.db文件下,会发现tt02文件夹中包含了导入的两个分区:

    [root@DataCenter2 Test]# hadoop fs -ls /user/hive/warehouse/test03.db/tt02
    drwxrwxrwt - root hive 0 2019-03-15 15:39 /user/hive/warehouse/test03.db/tt02/birth=1997
    drwxrwxrwt - root hive 0 2019-03-15 15:50 /user/hive/warehouse/test03.db/tt02/birth=1999

  分区表可以进行拓展,但是普通的表却无法进行拓展,一旦表中已经存在数据就无法再导入数据(空表则可以,但是字段要对应)。

  此外,能否一次性导出多个分区?我一开始认为有可能,但是经过数个小时的测试和查询,我不得不认为,应该是无法一次导出多个分区的。

  【3月28日更新:这个结论是我一开始得出的,但是今天我得知了动态分区的存在,根据动态分区的设定,一次性导入多个分区的数据是可以用动态分区实现的】

Hive中数据的导入与导出的更多相关文章

  1. 基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理

    在很多系统模块里面,我们可能都需要进行一定的数据交换处理,也就是数据的导入或者导出操作,这样的批量处理能给系统用户更好的操作体验,也提高了用户录入数据的效率.我在较早时期的EasyUI的Web框架上, ...

  2. 基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出

    数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在之前的一篇文章<Winform开发框架之通用数据导入导出操作>介绍了在Winform ...

  3. Matlab文件和数据的导入与导出

    ref: https://blog.csdn.net/zengzeyu/article/details/72530596 Matlab文件和数据的导入与导出 2017年05月19日 15:18:35  ...

  4. (转)基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理

    http://www.cnblogs.com/wuhuacong/p/4777720.html 在很多系统模块里面,我们可能都需要进行一定的数据交换处理,也就是数据的导入或者导出操作,这样的批量处理能 ...

  5. Oracle 数据的导入和导出(SID service.msc)

    一:版本号说明: (1)(Oracle11  32位系统)Oracle - OraDb11g_home1: (2)成功安装后显演示样例如以下:第一个图是管理工具.创建连接.创建表:第二个是数据库创建工 ...

  6. Hive中数据加载失败:root:supergroup:drwxr-xr-x

    Hive中数据加载失败:inode=:root:supergroup:drwxr-xr-x 在执行hive,数据加载的时候,遇到了一个错误,如下图: 在执行程序的过程中,遇到权限问题很正常,背后原理也 ...

  7. hive中数据存储格式对比:textfile,parquent,orc,thrift,avro,protubuf

    这篇文章我会从业务中关注的: 1. 存储大小 2.查询效率 3.是否支持表结构变更既数据版本变迁 5.能否避免分隔符问题 6.优势和劣势总结 几方面完整的介绍下hive中数据以下几种数据格式:text ...

  8. kettle连接Hive中数据导入导出(6)

    1.hive往外写数据 http://wiki.pentaho.com/display/BAD/Extracting+Data+from+Hive+to+Load+an+RDBMS 连接hive

  9. Hive中数据的加载和导出

    原文:http://blog.javachen.com/2014/06/09/hive-data-manipulation-language.html 关于 Hive DML 语法,你可以参考 apa ...

随机推荐

  1. Saiku资源帖

    一.精选 1.李秋 随笔分类 - pentaho 二.概述 1.Saiku + Kylin 多维分析平台探索 三.Saiku+Kylin 1.使用Saiku+Kylin构建多维分析OLAP平台 2.使 ...

  2. babel 7.x 和 webpack 4.x 配置vue项目

    很偶然的今天想开个自己的小项目,记录一下最近项目工程上实现的一个小交互.按照之前运行非常流畅的配置走一遍,打包遇到各种坑.只好根据命令行的报错逐个排查,发现babel升级了一个大版本,已经到7.x了. ...

  3. 阿里云windows 2008 服务器处理挖矿程序 Miner

    阿里云盾最近报发现wanacry蠕虫病毒和挖矿进程异常 仔细检查进程后,发现两个奇怪的进程 Eternalblue-2.2.0.exe,winlogins.exe 特别是伪装成 winlogins.e ...

  4. 【Linux】文件IO --- sync、fsync、fdatesync

    在使用write函数向文件中写入数据的时候,并不是在调用了函数以后就直接把数据写入磁盘:操作系统在内核中设置了一块专门的缓冲区,数据会先被写入到内核的缓冲区中,等到缓冲区满了或者系统需要重新利用缓冲区 ...

  5. String.StartsWith 方法

    startsWith() 方法用于检测字符串是否以指定的前缀开始. 语法 public boolean startsWith(String prefix, int toffset) 或 public ...

  6. 机器学习总结(二)bagging与随机森林

    一:Bagging与随机森林 与Boosting族算法不同的是,Bagging和随机森林的个体学习器之间不存在强的依赖关系,可同时生成并行化的方法. Bagging算法 bagging的算法过程如下: ...

  7. qt 串口

    if(ui->connectSerialBtn->text() == tr("打开串口")) { //ui->showSerialInfo->setEnab ...

  8. RESTClient的基本使用

    1.本人使用的是火狐浏览器,其他浏览器应该也有(没试过),安装插件RESTClient. 2.1.打开RESTClient:

  9. eval()和JSON.parse()的区别

    我们将一个josn字符串解析为对象的时可以使用两种方法: 假设有一个json字符串: '{ "student" : [ {}, {}, {} ] }' 然后解析为对象: 1.eva ...

  10. python中import与from方法总结

    一.模块&包简介 模块:所谓模块就是一个.py文件,用来存放变量,方法的文件,便于在其他python文件中导入(通过import或from). 包(package): 包是更大的组织单位,用来 ...