hive数据库怎么建表和数据装载

条条大路通罗马,这里挑选几种常见的数据源形式,各介绍一种简单的方式。

为了让有兴趣的同学可以按步骤操作,同时保障数据安全,此处提供了一个无业务数据的非正式环境。

关系型数据库(Mysql)

含有固定分隔符或者可以正则匹配数据格式的分隔符文件,无需代码解析,可以直接在HIVE中创建一张外部表,引用该数据文件路径(HDFS路径,HDFS即Hadoop分布式文件系统,HIVE表底层数据都保存在HDFS),再指定文件列分隔符或解析数据的正则表达式等信息即可。

接下来我们一步步处理。

(1) SSH登录大数据平台入口机器

使用自己喜好的工具登录以htdw身份登录10.90.111.71服务器。

(2) 创建存放数据文件的HDFS路径并上传数据文件

#将Linux服务器本地文件上传到HDFS的指定路径 #查看上传到hdfs的文件

(3) 在HIVE中创建外表引用该HDFS数据文件

#执行hive命令进行hive命令行交互窗口,hive的建表、查询语句都在该基础上进行
#执行查询语句查看数据
 

至此,我们就实现了将分隔符数据文件导入到hive中。

3. 关系型数据库表导入HIVE

关系型数据库一般支持JDBC连接,我们可以使用SQOOP方便的实现关系型数据库与大数据平台之间数据的导入与导出。这里我们将以Mysql为例,将Mysql中htdw.balance表导入到hive中的htdw.balance_frommysql表。

(1) SSH登录大数据平台入口机器

使用自己喜好的工具登录以htdw身份登录10.90.111.71服务器。

至此,我们就完成了最基本的关系型数据库表导入hive表操作,可以到hive库中查看已经导入的表数据了。

--password-alias 是传入加密后字符串的别名,避免明文暴露在代码中。将密码字符串加密的操作见拓展部分。

数据导入到hive中后,可根据需求,供impala、spark等多种引擎来查询。

对于特别小数据量单表简单聚合,使用hive并体现不出来优势,因为它基于MR,光启停任务就费不少时间。但当多表关联,每个表上千万,计算复杂一些,优势就逐渐体现出来了。

同时我们也可以切换hive默认的引擎为spark,充分利用集群的内存计算,或者使用impala等及思源引擎来执行查询,以便在不同的场景获得更快的执行速率。我们沙箱环境的dbeaver默认配置的就是基于impala执行引擎查询hive中的数据。

在中,介绍了可以把Hive当成一个“数据库”,它也具备传统数据库的数据单元,数据库(Database/Schema)和表(Table)。

本文介绍一下Hive中的数据库(Database/Schema)和表(Table)的基础知识,由于篇幅原因,这里只是一些常用的、基础的。

从图上可以看出,Hive作为一个“数据库”,在结构上积极向传统数据库看齐,也分数据库(Schema),每个数据库下面有各自的表组成。

表示该表为外部表,如果不指定EXTERNAL关键字,则表示内部表

表示该表为分区表,分区字段为day,类型为string

指定表的分隔符,通常后面要与以下关键字连用:

指定表在HDFS上的文件存储格式,可选的文件存储格式有:

ORC //列式存储格式文件,比RCFILE有更高的压缩比和读写效率,Hive0.11以后开始支持

指定表在HDFS上的存储位置。

hive中有一个默认的库:

库建好后,在hdfs中会生成一个库目录:

表建好后,会在所属的库目录中生成一个表目录

只是,这样建表的话,hive会认为表数据文件中的字段分隔符为 ^A

这样就指定了,我们的表数据文件中的字段分隔符为 ","

hive会从元数据库中清除关于这个表的信息;

hive还会从hdfs中删除这个表的表目录;

外部表和内部表的特性差别:

  1. 内部表的目录在hive的仓库目录中 VS 外部表的目录由用户指定
  2. drop一个内部表时:hive会清除相关元数据,并删除表数据目录
  3. drop一个外部表时:hive只会清除相关元数据;

一个hive的数据仓库,最底层的表,一定是来自于外部系统,为了不影响外部系统的工作逻辑,在hive中可建external表来映射这些外部系统产生的数据目录;

然后,后续的etl操作,产生的各种表建议用managed_table

分区表的实质是:在表目录中为数据文件创建分区子目录,以便于在查询时,MR程序可以针对分区子目录中的数据进行处理,缩减读取数据的范围。

比如,网站每天产生的浏览记录,浏览记录应该建一个表来存放,但是,有时候,我们可能只需要对某一天的浏览记录进行分析

这时,就可以将这个表建为分区表,每天的数据导入其中的一个分区;

当然,每日的分区目录,应该有一个目录名(分区字段)

注意:分区字段不能是表定义中的已存在字段

a、统计8月4号的总PV:

实质:就是将分区字段当成表字段来用,就可以使用where子句指定分区了

b、统计表中所有数据总的PV:

实质:不指定分区条件即可

可以通过已存在表来建表:

新建的t_user_2表结构定义与源表t_user一致,但是没有数据

t_access_user会根据select查询的字段来建表,同时将查询的结果插入新表中

  1. 将数据文件导入hive的表

方式1:导入数据的一种方式:

手动用hdfs命令,将文件放入表目录;

方式2:在hive的交互式shell中用hive命令来导入本地数据到表目录

方式3:用hive命令导入hdfs中的数据文件到表目录

注意:导本地文件和导HDFS文件的区别:

hdfs文件导入表:移动

    1. 将hive表中的数据导出到指定路径的文件
  1. 将hive表中的数据导入HDFS的文件
  1. 将hive表中的数据导入本地磁盘文件

从文本表中查询数据插入sequencefile表中,生成数据文件就是sequencefile格式的了:

示例,假如有以下数据文件:

那么,就可以建一个表来对数据进行映射

示例:array类型的应用

假如有如下数据需要用hive的表去映射:

战狼2,吴京:吴刚:龙母,

三生三世十里桃花,刘亦菲:痒痒,

设想:如果主演信息用一个数组来映射比较方便

可以用一个map类型来对上述数据中的家庭成员进行描述

## 综合:查询有brother的用户信息

其中的用户信息包含:年龄:整数,性别:字符串,地址:字符串

设想用一个字段来描述整个用户信息,可以采用struct

仅修改Hive元数据,不会触动表中的数据,用户需要确定实际的数据布局符合元数据的定义。

修改表的文件格式定义:

我要回帖

更多关于 plsql怎么新建一个数据库 的文章

 

随机推荐