Hadoop历险记(八 Hive基本的库表操作)

本文介绍了在Hadoop集群上搭建并使用Hive进行数据操作,包括创建数据库、表的分区和桶的概念,以及内部表和外部表的区别。特别提到了默认的字段分隔符01和如何处理中文注释的乱码问题。此外,还讲解了最简单的数据导入方法,即通过HDFS网页界面上传数据文件。
摘要由CSDN通过智能技术生成

在这一章之前 已经搭建好了hadoop,hive集群。且服务可以正常启动。
做好了前期这些准备工作,就可以动手实战hive了。

库操作

和我们平时用的sql一样 首先要建库 然后可以删改 这些基础语句很简单就不赘述。 这里要记录一点 就是你在hive里面 写完create datebase xxx 这个库会存到哪里。
默认路径是 :

hdfs://node1:8020/user/hive/warehouse/xxx.db

hdfs://node1:8020前面的这部分是hdfs的远程url。
之前讲了 hive里面的表会映射hdfs里面的一个文件 既然你创建了库 那么库下面的表 自然就会存到上面那个xxx.db路径下面了。
(这里再次强调 hdfs这个路径是抽象路径 真实的数据是分块存储在各个机器上的)

表操作

hive的建表语句一定要认真学一下 因为我们用hive分析数据 最常用的就是不停的建表 。查询 ,用查到的数据建新表.
没有接触过hive的新手 会发现和mysql的建表是有区别的,因为他们的底层不一样:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[ (col_name data_type [COMMENT col_comment], ...) ]
[COMMENT table_comment]
[PARTITIONED BY(col_name data_type [COMMENT col_comment],...) ]
[CLUSTERED BY (col_name,col_name,...)]
[SORTED BY(col_name [ASC|DESC],...)] INTO num_buckers BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]

新手一看到这么多乱七八糟的 心理会有排斥 不要慌 很多东西可以先不用管 一步一步后面再理解


1、CREATE TABLE 创建一个指定名字的表,如果库中已有相同名的表,则抛出异常;
用户可以使用 IF NOT EXISTS 选项来忽略此异常。

2、EXTERNAL 关键字可以让用户创建一个外部表(默认创建内部表)。外部表在建表的同时必须指定一个指向实际数据的路径(LOCATION),Hive在创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

3、COMMENT 是给表字段或者表内容添加注释说明的。

4、PARTITIONED BY 给表做分区,决定了表是否为分区表。

5、CLUSTERED BY 对于每一个表(table)或者分区, Hive 可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分,Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

6、ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’, 这里指定表存储中列的分隔符,默认是 \001,这里指定的是逗号分隔符,还可以指定其他列的分隔符。

7、STORED AS SEQUENCEFILE|TEXTFILE|RCFILE,如果文件数据是纯文本,可以使用 STORED AS TEXTFILE,如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

8、LOCATION 定义 hive 表的数据在 hdfs 上的存储路径,一般管理表(内部表不不要自定义),但是如果定义的是外部表,则需要直接指定一个路径。


这里要注意分隔符指定语法 它有四种 来指定文件中的数据按什么char来分割 我们最常用的就是第一种:字段分隔符
在这里插入图片描述

比如我们现在找一个结构化文件 文件里面是王者荣耀的英雄属性 每个字段的分隔符是\t 制表符 将它映射成一张表 我们暂时不写上面那些多余的可选参数 就写最基本的 创建和分隔符制订
(这里新手要记得 不要偷懒 所有的sql语句都要自己敲一遍)
打开dbeaver:

use xxx(库名)

CREATE table t_archer(
 id int,
 name string,
 hp_max int,
 mp_max int,
 attack_max int,
 defense_max int,
 attack_range string,
 role_main string,
 role_assist string
)
row format delimited
fields terminated by "\t";

创建成功之后 我们的表就默认在
hdfs://node1:8020/user/hive/warehouse/xxx.db路径 下面了,当然现在的它里面什么数据都没有 我们只是建好了这样一张表。

外部表和内部表

这个概念在理解了前面的hive抽象表和hdfs的文件映射之后 就非常好理解了
内部表就是上面讲的你建了库之后 表的文件内存在hdfs 你的库文件目录之下。

而外部表就是 这个文件路径可能不在hive库文件目录里面 它可以在其他的地方 比如它放在linux的某个文件夹下面 这种就叫外部表。因为hive和hdfs并不是强关联的 它只是友好的查询hdfs里的数据。 有时候 这个文件除了hive还有其他的查询程序要查 所以它等于是一个共享的文件, 一个外部的文件 作为hive抽象表的映射文件 这种就叫外部表

导入数据

我们刚开始接触hive 先来一个最简单 最友好的导入方法。
直接打开hdfs的web页面 在新建的表里面将本地的数据文件上传上去(文件中的字段顺序要和建表的字段顺序对齐 记得检查一下)

在这里插入图片描述
在这里插入图片描述

数据就这样进去了 是不是很方便,字段之间的具体的映射工作 hive帮你干了。 当然我们在实际工作中要往 hive里面导入数据 肯定不可能像这样页面手动上传的, 具体的加载数据 我们后面在说。


默认分隔符 \001

这里要说一个重点,如果建表语句中不加 指定分隔符。 它不会报错,那它默认会使用什么分隔符来 分隔文本中的字段呢???

hive中使用的默认分隔符叫 \001 .
这种分隔符 键盘是打不出来 它属于非打印字符 一般在代码里面 做数据开发的时候 会使用到它。
这个\001 你用notepad+打开之后 它显示的是:SOH
在这里插入图片描述


再说一个细节 hive表注释中的中文乱码解决。
比如你建了一张hive表 里面的中文注释 都显示乱码。
这是为什么? 因为hive的元数据信息 是存在额外的远程mysql中的,
而这个mysql的编码不一定是utf8, 我们要将它改过来。

问题来了 还记得怎么找到这个存metadata的远程mysql吗? 在hive的配置文件中 很详细的记录了 存元数据的mysql的IP 端口 用户名 密码。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值