3.1.3.Hadoop生态圈技术栈(Hive、Flume、Sqoop)

Hadoop生态圈技术栈(上)

主要内容

数据仓库工具:Hive【重点】
数据交互工具:Hue
数据采集工具:Flume
数据迁移工具:Sqoop

数据仓库工具 – Hive

第一部分 Hive概述

HDFS => 海量数据的存储
MapReduce => 海量数据的分析和处理
YARN => 集群资源的管理和作业调度

第 1 节 Hive产生背景

直接使用MapReduce处理大数据,将面临以下问题:

- MapReduce 开发难度大,学习成本高(wordCount => Hello World)
- Hdfs文件没有字段名、没有数据类型,不方便进行数据的有效管理
- 使用MapReduce框架开发,项目周期长,成本高

Hive是基于Hadoop的一个数据仓库工具,可以将 结构化的数据文件 映射为一张表
(类似于RDBMS中的表),并提供类SQL查询功能;Hive是由Facebook开源,用于解
决海量结构化日志的数据统计。

  • Hive本质是:将 SQL 转换为 MapReduce 的任务进行运算
  • 底层由HDFS来提供数据存储
  • 可以将Hive理解为一个:将 SQL 转换为 MapReduce 任务的工具

数据仓库(Data Warehouse)是一个面向主题的、集成的、相对稳定的、反映历史变
化的数据集合,主要用于管理决策。(数据仓库之父比尔·恩门,1991年提出)。

  • 数据仓库的目的:构建面向分析的、集成的数据集合;为企业提供决策支持
  • 数据仓库本身不产生数据,数据来源与外部
  • 存储了大量数据,对这些数据的分析和处理不可避免的用到Hive

第 2 节 Hive和RDBMS对比

由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将
Hive 理解为数据库。其实从结构上来看,Hive 和传统的关系数据库除了拥有类似的
查询语言,再无类似之处。

查询语言相似。HQL <=> SQL 高度相似
由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询
语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
数据规模。Hive存储海量数据;RDBMS只能处理有限的数据集;
由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模
的数据;而RDBMS可以支持的数据规模较小。
执行引擎。Hive的引擎是MR/Tez/Spark/Flink;RDBMS使用自己的执行引擎
Hive中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的。而RDBMS
通常有自己的执行引擎。
数据存储。Hive保存在HDFS上;RDBMS保存在本地文件系统 或 裸设备
Hive 的数据都是存储在 HDFS 中的。而RDBMS是将数据保存在本地文件系统或裸设
备中。
执行速度。Hive相对慢(MR/数据量);RDBMS相对快;
Hive存储的数据量大,在查询数据的时候,通常没有索引,需要扫描整个表;加之
Hive使用MapReduce作为执行引擎,这些因素都会导致较高的延迟。而RDBMS对数据
的访问通常是基于索引的,执行延迟较低。当然这个低是有条件的,即数据规模较小,
当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出并行的优
势。
可扩展性。Hive支持水平扩展;通常RDBMS支持垂直扩展,对水平扩展不友好
Hive建立在Hadoop之上,其可扩展性与Hadoop的可扩展性是一致的(Hadoop集群
规模可以轻松超过1000个节点)。而RDBMS由于 ACID 语义的严格限制,扩展行非常
有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有100台左右。
数据更新。Hive对数据更新不友好;RDBMS支持频繁、快速数据更新
Hive是针对数据仓库应用设计的,数据仓库的内容是读多写少的。因此,Hive中不建
议对数据的改写,所有的数据都是在加载的时候确定好的。而RDBMS中的数据需要频
繁、快速的进行更新。

第 3 节 Hive的优缺点

Hive的优点
学习成本低。Hive提供了类似SQL的查询语言,开发人员能快速上手;
处理海量数据。底层执行的是MapReduce 任务;
系统可以水平扩展。底层基于Hadoop;
功能可以扩展。Hive允许用户自定义函数;
良好的容错性。某个节点发生故障,HQL仍然可以正常完成;
统一的元数据管理。元数据包括:有哪些表、表有什么字段、字段是什么类型。

Hive的缺点
HQL表达能力有限;
迭代计算无法表达;
Hive的执行效率不高(基于MR的执行引擎);
Hive自动生成的MapReduce作业,某些情况下不够智能;
Hive的调优困难;

第 4 节 Hive架构

在这里插入图片描述

  1. 用户接口 CLI(Common Line Interface):Hive的命令行,用于接收HQL,并返
    回结果; JDBC/ODBC:是指Hive的java实现,与传统数据库JDBC类似;
    WebUI:是指可通过浏览器访问Hive;
  2. Thrift Server
    Hive可选组件,是一个软件框架服务,允许客户端使用包括Java、C++、Ruby和
    其他很多种语言,通过 编程的方式远程访问Hive;
  3. 元数据管理(MetaStore) Hive将元数据存储在关系数据库中(如mysql、
    derby)。Hive的元数据包括:数据库名、表名及类型、字段名称及数据类型、数
    据所在位置等;
  4. 驱动程序(Driver)
    解析器 (SQLParser) :使用第三方工具(antlr)将HQL字符串转换成抽象语
    法树(AST);对AST进行语法分析,比如字段是否存在、SQL语义是否有
    误、表是否存在;
    编译器 (Compiler) :将抽象语法树编译生成逻辑执行计划;
    优化器 (Optimizer) :对逻辑执行计划进行优化,减少不必要的列、使用分
    区等;
    执行器 (Executr) :把逻辑执行计划转换成可以运行的物理计划;

第二部分 Hive安装与配置

第 1 节 Hive安装配置

Hive官网:http://hive.apache.org

下载网址:http://archive.apache.org/dist/hive/

文档网址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual

安装前提:3台虚拟机,安装了Hadoop

安装软件:Hive(2.3.7) + MySQL (5.7.26)

备注:Hive的元数据默认存储在自带的 derby 数据库中,生产中多采用MySQL

derby:java语言开发占用资源少,单进程,单用户。仅仅适用于个人的测试。

软件linux121linux122linux123
Hadoop
MySQL
Hive
# hive安装包
apache-hive-2.3.7-bin.tar.gz 

# MySQL安装包
mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

# MySQL的JDBC驱动程序
mysql-connector-java-5.1.46.jar

# 整体的安装步骤:
1、安装MySQL
2、安装配置Hive
3、Hive添加常用配置
2.1.1、MySQL安装

Hive中使用MySQL存储元数据,MySQL的版本 5.7.26。安装步骤:

1、环境准备(删除有冲突的依赖包、安装必须的依赖包)
2、安装MySQL
3、修改root口令(找到系统给定的随机口令、修改口令)
4、在数据库中创建hive用户
1、删除MariaDB

centos7.6自带的 MariaDB(MariaDB是MySQL的一个分支),与要安装的MySQL有冲
突,需要删除。

# 查询是否安装了mariadb
rpm -aq | grep mariadb
# 删除mariadb。-e 删除指定的套件;--nodeps 不验证套件的相互关联性
rpm -e --nodeps mariadb-libs

在这里插入图片描述

2、安装依赖
yum install perl -y
yum install net-tools -y

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

3、安装MySQL
# 解压缩
tar xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
# 依次运行以下命令
rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm

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

4、启动数据库
systemctl start mysqld 

在这里插入图片描述

5、查找root密码
grep password /var/log/mysqld.log 
6、修改 root 口令
# 进入MySQL,使用前面查询到的口令
mysql -u root -p
# 设置口令强度;将root口令设置为hadoop;刷新
set global validate_password_policy=0;
# 注:本机linux123执行报错,需删除password关键字。
set password for 'root'@'localhost' =password('hadoop');
set password for 'root'@'localhost' ='hadoop';
flush privileges;

# 使用新密码登录
mysql -uroot -phadoop;

validate_password_policy 密码策略(默认是1),可配置的值有以下:

  • 0 or LOW 仅需需符合密码长度(由参数validate_password_length【默认为8】
    指定)
  • 1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写
    字母和特殊字符
  • 2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary
    file)中
    备注:个人开发环境,出于方便的目的设比较简单的密码;生产环境一定要设复杂密
    码!
6.1.问题1:修改密码后,报错拒绝访问?

在这里插入图片描述
查找问题步骤:
1.Linux下MySQL配置文件my.ini位置?
答:MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下;在Linux下叫my.cnf,该文件位于/etc/my.cnf。

# 编辑配置文件
vim my.cnf

在这里插入图片描述

# 查找文件命令
find / -name my.cnf

在这里插入图片描述
解决办法:
ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)
翻译:
错误1045(28000):对用户“root”@本地主机拒绝访问(使用密码:是)
一般这个错误是由密码错误引起,解决的办法自然就是重置密码。
1.重置密码的第一步就是跳过MySQL的密码认证过程,方法如下:
#vim /etc/my.cnf(注:windows下修改的是my.ini)
在[mysqld]后面任意一行添加“skip-grant-tables”用来跳过密码验证的过程,如下图所示:
在这里插入图片描述
2.点击ESC 使用 :wq!保存并退出
在这里插入图片描述
3.使用 service mysqld restart 重启MySQL服务
在这里插入图片描述
4.免密码登陆(注:敲入 mysql -u root -p 命令然后回车,当需要输入密码时,直接按enter键,便可以不用密码登录到数据库当中)
在这里插入图片描述
5.flush privileges;(首先更新权限)
在这里插入图片描述
6.修改新密码

ALTER USER 'root'@'localhost' IDENTIFIED BY 'hadoop';

在这里插入图片描述
7.quit;或者exit;退出
8.使用vim /etc/my.cnf命令把 my.cnf中添加的skip-grant-table删除
9.重启MySQL输入刚设置的密码,完成登陆

mysql -uroot -phadoop

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

7、创建 hive 用户
-- 创建用户设置口令、授权、刷新
CREATE USER 'hive'@'%' IDENTIFIED BY 'Pass123$';
GRANT ALL ON *.* TO 'hive'@'%';
FLUSH PRIVILEGES;

在这里插入图片描述

2.1.2、Hive 安装
安装步骤:
1、下载、上传、解压缩
2、修改环境变量
3、修改hive配置
4、拷贝JDBC的驱动程序
5、初始化元数据库

1、下载Hive软件,并解压缩

cd /opt/lagou/software
tar zxvf apache-hive-2.3.7-bin.tar.gz -C ../servers/
cd ../servers
mv apache-hive-2.3.7-bin hive-2.3.7

在这里插入图片描述

2、修改环境变量

# 在 /etc/profile 文件中增加环境变量
export HIVE_HOME=/opt/lagou/servers/hive-2.3.7
export PATH=$PATH:$HIVE_HOME/bin
# 执行并生效
source /etc/profile

在这里插入图片描述

3、修改 Hive 配置
cd $HIVE_HOME/conf vi hive-site.xml 增加以下内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- hive元数据的存储位置 -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://linux123:3306/hivemetadata?createDatabaseIfNotExist=true&amp;useSSL=false</value>
        <description>JDBC connect string for a JDBC metastore</description>
    </property>
    <!-- 指定驱动程序 -->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
        <description>Driver class name for a JDBC metastore</description>
    </property>
    <!-- 连接数据库的用户名 -->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>hive</value>
        <description>username to use against metastore database</description>
    </property>
    <!-- 连接数据库的口令 -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>Pass123$</value>
        <description>password to use against metastore database</description>
    </property>
</configuration>

备注:

  • 注意jdbc的连接串,如果没有 useSSL=false 会有大量警告
  • 在xml文件中 & 表示 &

4、拷贝 MySQL JDBC 驱动程序
将 mysql-connector-java-5.1.46.jar 拷贝到 $HIVE_HOME/lib

[root@linux123 software]# cp mysql-connector-java-5.1.46.jar /opt/lagou/servers/hive-2.3.7/lib/

5、初始化元数据库

[root@linux123 ~]$ schematool -dbType mysql -initSchema 

在这里插入图片描述

6、启动Hive,执行命令

# 启动hive服务之前,请先启动hdfs、yarn的服务
[root@linux123 ~]$ hive
hive> show functions;

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

2.1.3、Hive 属性配置

可在 hive-site.xml 中增加以下常用配置,方便使用。

# 新增配置信息
[root@linux123 ~]# vi $HIVE_HOME/conf/hive-site.xml 

# 检查配置信息
[root@linux123 ~]# more $HIVE_HOME/conf/hive-site.xml

数据存储位置

<property>
  <!-- 数据默认的存储位置(HDFS) -->
  <name>hive.metastore.warehouse.dir</name>
  <value>/user/hive/warehouse</value>
  <description>location of default database for the
warehouse</description>
</property>

显示当前库

<property>
  <!-- 在命令行中,显示当前操作的数据库 -->
  <name>hive.cli.print.current.db</name>
  <value>true</value>
  <description>Whether to include the current database in the
Hive prompt.</description>
</property>

在这里插入图片描述
问题1:日志显示警告。
在这里插入图片描述
问题2:hive跟hadoop存在jar包冲突警告。
在这里插入图片描述
解决方法:删除hive冲突jar包。
在这里插入图片描述

显示表头属性

<property>
  <!-- 在命令行中,显示数据的表头 -->
  <name>hive.cli.print.header</name>
  <value>true</value>
</property>

本地模式

<property>
  <!-- 操作小规模数据时,使用本地模式,提高效率 -->
  <name>hive.exec.mode.local.auto</name>
  <value>true</value>
  <description>Let Hive determine whether to run in local
mode automatically</description>
</property>

备注:当 Hive 的输入数据量非常小时,Hive 通过本地模式在单台机器上处理所有的
任务。对于小数据集,执行时间会明显被缩短。当一个job满足如下条件才能真正使
用本地模式:

  • job的输入数据量必须小于参数:hive.exec.mode.local.auto.inputbytes.max
    (默认128MB)
  • job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max (默认4)
  • job的reduce数必须为0或者1
    在这里插入图片描述

Hive的日志文件
Hive的log默认存放在 /tmp/root 目录下(root为当前用户名);这个位置可以修改。
hive默认存放日志路径
在这里插入图片描述
在这里插入图片描述

vi $HIVE_HOME/conf/hive-log4j2.properties
# 添加以下内容:
property.hive.log.dir = /opt/lagou/servers/hive-2.3.7/logs

可以不修改,但是要知道位置。
在这里插入图片描述

Hadoop 2.x 中 NameNode RPC缺省的端口号:8020
对端口号要敏感
附录:添加第三方用户(Hadoop)

groupadd hadoop
# -m:自动建立用户的登入目录
# -g:指定用户所属的起始群组
# -G<群组>:指定用户所属的附加群组
# -s:指定用户登入后所使用的shell
useradd -m hadoop -g hadoop -s /bin/bash
passwd hadoop
visudo
# 在100行后添加。允许用户执行sudo,免密
hadoop  ALL=(ALL)    NOPASSWD:ALL

建议:现阶段使用root用户
小结:
1、添加了配置,使用Hive更方便;
2、删除了有冲突的软件包(hive)
3、Hive的日志在哪里(/tmp/root)
4、第三方用户使用Hive。建议使用root用户
5、NameNode 缺省的RPC(远程过程调用)端口号8020,经常使用的端口号9000

2.1.4、参数配置方式

查看参数配置信息:

-- 查看全部参数
hive> set;
-- 查看某个参数
hive> set hive.exec.mode.local.auto;
hive.exec.mode.local.auto=false

参数配置的三种方式:

1、用户自定义配置文件(hive-site.xml)
2、启动hive时指定参数(-hiveconf)
3、hive命令行指定参数(set)
配置信息的优先级:
set > -hiveconf > hive-site.xml > hive-default.xml

1、配置文件方式
默认配置文件:hive-default.xml
用户自定义配置文件:hive-site.xml
配置优先级:hive-site.xml > hive-default.xml
配置文件的设定对本机启动的所有Hive进程有效

2、启动时指定参数值
启动Hive时,可以在命令行添加 -hiveconf param=value 来设定参数,这些设定仅
对本次启动有效。

# 启动时指定参数
hive -hiveconf hive.exec.mode.local.auto=true
# 在命令行检查参数是否生效
hive> set hive.exec.mode.local.auto;
hive.exec.mode.local.auto=true

3、命令行修改参数
可在 Hive 命令行中使用SET关键字设定参数,同样仅对本次启动有效

hive> set hive.exec.mode.local.auto=false;
hive> set hive.exec.mode.local.auto;
hive.exec.mode.local.auto=false

set > -hiveconf > hive-site.xml > hive-default.xml

第 2 节 Hive命令

1、Hive

hive -help
usage: hive
-d,--define <key=value>     Variable substitution to
apply to Hive
                commands. e.g. -d A=B or --
define A=B
  --database <databasename>   Specify the database to use
-e <quoted-query-string>     SQL from command line
-f <filename>          SQL from files
-H,--help            Print help information
  --hiveconf <property=value>  Use value for given property
  --hivevar <key=value>     Variable substitution to
apply to Hive
                commands. e.g. --hivevar A=B
-i <filename>          Initialization SQL file
-S,--silent           Silent mode in interactive
shell
-v,--verbose           Verbose mode (echo executed
SQL to the
                console)

-e:不进入hive交互窗口,执行sql语句

hive -e "select * from users" 

-f:执行脚本中sql语句

# 创建文件hqlfile1.sql,内容:select * from users
# 执行文件中的SQL语句
hive -f hqlfile1.sql
# 执行文件中的SQL语句,将结果写入文件
hive -f hqlfile1.sql >> result1.log

2、退出Hive命令行

exit; quit;

3、在命令行执行 shell 命令 / dfs 命令

hive> ! ls;
hive> ! clear;
hive> dfs -ls / ;

第三部分 数据类型与文件格式

Hive支持关系型数据库的绝大多数基本数据类型,同时也支持4种集合数据类型。

第 1 节 基本数据类型及转换

Hive类似和java语言中一样,会支持多种不同长度的整型和浮点类型数据,同时也支
持布尔类型、字符串类型,时间戳数据类型以及二进制数组数据类型等。具体的如下
表:

大类类型
Integers(整型)TINYINT – 1字节的有符号整数
SMALLINT – 2字节的有符号整数
INT – 4字节的有符号整数
BIGINT – 8字节的有符号整数
Floating point numbers(浮点数)FLOAT – 单精度浮点数
DOUBLE – 双精度浮点数
Fixed point numbers(定点数)DECIMAL – 17字节,任意精度数字。通常用户自定义decimal(12, 6)
String(字符串)STRING – 可指定字符集的不定长字符串
VARCHAR – 1-65535长度的不定长字符串
CHAR – 1-255定长字符串
Datetime(时间日期类型)TIMESTAMP – 时间戳(纳秒精度)
DATE – 时间日期类型
Boolean(布尔类型)BOOLEAN – TRUE / FALSE
Binary types(二进制类型)BINARY – 字节序列

这些类型名称都是 Hive 中保留字。这些基本的数据类型都是 java 中的接口进行实现
的,因此与 java 中数据类型是基本一致的:
在这里插入图片描述
数据类型的隐式转换
Hive的数据类型是可以进行隐式转换的,类似于Java的类型转换。如用户在查询中将
一种浮点类型和另一种浮点类型的值做对比,Hive会将类型转换成两个浮点类型中值
较大的那个类型,即:将FLOAT类型转换成DOUBLE类型;当然如果需要的话,任意
整型会转化成DOUBLE类型。 Hive 中基本数据类型遵循以下层次结构,按照这个层
次结构,子类型到祖先类型允许隐式转换。
在这里插入图片描述
总的来说数据转换遵循以下规律:

  • 任何整数类型都可以隐式转换为一个范围更广的类型。tinyInt => int;int =>
    bigint
  • 所有整数类型、float、string(都是数字)都可以隐式转换为Double
  • tinyint、smallint、int => float
  • boolean 不能转换
hive> select '1.0'+2;
OK
3.0
hive> select '1111' > 10;
hive> select 1 > 0.8;

数据类型的显示转换
使用cast函数进行强制类型转换;如果强制类型转换失败,返回NULL

hive> select cast('1111s' as int);
OK
NULL
hive> select cast('1111' as int);
OK
1111

第 2 节 集合数据类型

Hive支持集合数据类型,包括array、map、struct、union
在这里插入图片描述
和基本数据类型一样,这些类型的名称同样是保留字;

ARRAY 和 MAP 与 Java 中的 Array 和 Map 类似;

STRUCT 与 C 语言中的 Struct 类似,它封装了一个命名字段集合,复杂数据类型允
许任意层次的嵌套;

hive> select array(1,2,3);
OK
[1,2,3]
-- 使用 [] 访问数组元素
hive> select arr[0] from (select array(1,2,3) arr) tmp;
hive> select map('a', 1, 'b', 2, 'c', 3);
OK
{"a":1,"b":2,"c":3}
-- 使用 [] 访问map元素
hive> select mymap["a"] from (select map('a', 1, 'b', 2, 'c',
3) as mymap) tmp;
-- 使用 [] 访问map元素。 key 不存在返回 NULL
hive> select mymap["x"] from (select map('a', 1, 'b', 2, 'c',
3) as mymap) tmp;
NULL
hive> select struct('username1', 7, 1288.68);
OK
{"col1":"username1","col2":7,"col3":1288.68}
-- 给 struct 中的字段命名
hive> select named_struct("name", "username1", "id", 7,
"salary", 12880.68);
OK
{"name":"username1","id":7,"salary":12880.68}
-- 使用 列名.字段名 访问具体信息
hive> select userinfo.id
  >  from (select named_struct("name", "username1", "id",
7, "salary", 12880.68) userinfo) tmp;
 
-- union 数据类型
hive> select create_union(0, "zhansan", 19, 8000.88) uinfo;

第 3 节 文本文件数据编码

Hive表中的数据在存储在文件系统上,Hive定义了默认的存储格式,也支持用户自定义文件存储格式。

Hive默认使用几个很少出现在字段值中的控制字符,来表示替换默认分隔符的字符。
Hive默认分隔符

id name age hobby(array) score(map)
字段之间:^A
元素之间: ^B
key-value之间:^C
666^Alisi^A18^Aread^Bgame^Ajava^C97^Bhadoop^C87
create table s1(
id int,
name string,
age int,
hobby array<string>,
score map<string, int>
);
load data local inpath '/home/hadoop/data/s1.dat' into table
s1;
select * from s1;

在这里插入图片描述
Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、"\t"、"\x001")、行分隔符("\n")以及读取文件数据的方法。

在加载数据的过程中,Hive 不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。

将 Hive 数据导出到本地时,系统默认的分隔符是A、B、^C 这些特殊字符,使用cat 或者 vim 是看不到的;
在 vi 中输入特殊字符:

  • (Ctrl + v) + (Ctrl + a) => ^A
  • (Ctrl + v) + (Ctrl + b) => ^B
  • (Ctrl + v) + (Ctrl + c) => ^C

^A / ^B / ^C 都是特殊的控制字符,使用 more 、 cat 命令是看不见的;可以使用cat -A file.dat

第 4 节 读时模式

在传统数据库中,在加载时发现数据不符合表的定义,则拒绝加载数据。数据在写入数据库时对照表模式进行检查,这种模式称为"写时模式"(schema on write)。

写时模式 -> 写数据检查 -> RDBMS;

Hive中数据加载过程采用"读时模式" (schema on read),加载数据时不进行数据格式的校验,读取数据时如果不合法则显示NULL。这种模式的优点是加载数据迅速。

读时模式 -> 读时检查数据 -> Hive;好处:加载数据快;问题:数据显示NULL

第四部分 HQL操作之 – DDL命令

参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

DDL(data definition language): 主要的命令有CREATE、ALTER、DROP等。

DDL主要是用在定义、修改数据库对象的结构 或 数据类型。
在这里插入图片描述

第 1 节 数据库操作

Hive有一个默认的数据库default,在操作HQL时,如果不明确的指定要使用哪个库,则使用默认数据库;

Hive的数据库名、表名均不区分大小写;

名字不能使用数字开头;

不能使用关键字,尽量不使用特殊符号;

创建数据库语法

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
 [COMMENT database_comment]
 [LOCATION hdfs_path]
 [MANAGEDLOCATION hdfs_path]
 [WITH DBPROPERTIES (property_name=property_value, ...)];
 
-- 创建数据库,在HDFS上存储路径为 /user/hive/warehouse/*.db
hive (default)> create database mydb;
hive (default)> dfs -ls /user/hive/warehouse;
-- 避免数据库已经存在时报错,使用 if not exists 进行判断【标准写法】
hive (default)> create database if not exists mydb;
-- 创建数据库。添加备注,指定数据库在存放位置
hive (default)> create database if not exists mydb2
comment 'this is mydb2'
location '/user/hive/mydb2.db';

查看数据库

-- 查看所有数据库
show database;
-- 查看数据库信息
desc database mydb2;
desc database extended mydb2;
describe database extended mydb2;

使用数据库

use mydb; 

删除数据库

-- 删除一个空数据库
drop database databasename;
-- 如果数据库不为空,使用 cascade 强制删除
drop database databasename cascade;

第 2 节 建表语法

create [external] table [IF NOT EXISTS] table_name
[(colName colType [comment 'comment'], ...)]
[comment table_comment]
[partition by (colName colType [comment col_comment], ...)]
[clustered BY (colName, colName, ...)
[sorted by (col_name [ASC|DESC], ...)] into num_buckets
buckets]
[row format row_format]
[stored as file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement];
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS]
[db_name.]table_name
 LIKE existing_table_or_view_name
 [LOCATION hdfs_path];
  1. CREATE TABLE。按给定名称创建表,如果表已经存在则抛出异常。可使用if not exists 规避。
  2. EXTERNAL关键字。创建外部表,否则创建的是内部表(管理表)。
    删除内部表时,数据和表的定义同时被删除;
    删除外部表时,仅仅删除了表的定义,数据保留;
    在生产环境中,多使用外部表;
  3. comment。表的注释
  4. partition by。对表中数据进行分区,指定表的分区字段
  5. clustered by。创建分桶表,指定分桶字段
  6. sorted by。对桶中的一个或多个列排序,较少使用
  7. 存储子句。
ROW FORMAT DELIMITED
[FIELDS TERMINATED BY char]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char] | SERDE serde_name
[WITH SERDEPROPERTIES (property_name=property_value,
property_name=property_value, ...)]

建表时可指定 SerDe 。如果没有指定 ROW FORMAT 或者 ROW FORMAT
DELIMITED,将会使用默认的 SerDe。建表时还需要为表指定列,在指定列的同时也会指定自定义的 SerDe。Hive通过 SerDe 确定表的具体的列的数据。
SerDe是 Serialize/Deserilize 的简称, hive使用Serde进行行对象的序列与反序列化。

  1. stored as SEQUENCEFILE|TEXTFILE|RCFILE。如果文件数据是纯文本,可以使用 STORED AS TEXTFILE(缺省);如果数据需要压缩,使用 STORED AS SEQUENCEFILE(二进制序列文件)。
  2. LOCATION。表在HDFS上的存放位置
  3. TBLPROPERTIES。定义表的属性
  4. AS。后面可以接查询语句,表示根据后面的查询结果创建表
  5. LIKE。like 表名,允许用户复制现有的表结构,但是不复制数据

第 3 节 内部表 & 外部表

在创建表的时候,可指定表的类型。表有两种类型,分别是内部表(管理表)、外部表。

  • 默认情况下,创建内部表。如果要创建外部表,需要使用关键字 external
  • 在删除内部表时,表的定义(元数据) 和 数据 同时被删除
  • 在删除外部表时,仅删除表的定义,数据被保留
  • 在生产环境中,多使用外部表

内部表
t1.dat文件内容

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hadoop是一个分布式数据处理框架,目前最新版本是hadoop-3.1.3.tar.gz。该版本中包含了许多新特性和改进,如资源调度器改进、任务并行度控制、应用协议改进等,可以提高数据处理性能和可靠性。 要下载hadoop-3.1.3.tar.gz,可以进行以下步骤: 1. 打开Hadoop官方网站,定位到下载页面。 2. 在下载页面中找到hadoop-3.1.3.tar.gz的下载链接,点击进入。 3. 选择合适的下载源,并开始下载。 4. 下载完成后,可以解压文件并根据官方文档进行安装和配置。 需要注意的是,在下载和安装Hadoop之前,要先确保系统满足最低硬件和软件要求,如JDK版本、内存、磁盘空间等,否则可能会出现各种问题。同时,为了发挥Hadoop的优势,还需要了解分布式数据处理的原理和技术,并按照最佳实践进行部署和运维。 ### 回答2: Hadoop是一个开源的分布式系统框架,专为大规模数据处理而设计,其核心是Hadoop Distributed File System(HDFS)和MapReduce计算模型,可以在廉价的硬件上部署高可用和高可伸缩的数据存储和处理集群。Hadoop适用于处理大型数据集,每个数据节点都能够进行本地计算,使得数据的处理效率更高。 hadoop-3.1.3.tar.gz是Hadoop的一个版本,可以在线下载原始码文件,也可以从Apache官网上下载,这个版本是Hadoop的新版本之一,更新版本是为了解决之前版本中的一些bug和性能问题,同时加入了新的特性以及增强了集群的管理能力。 下载hadoop-3.1.3.tar.gz的步骤: 1.打开Apache Hadoop官网,找到下载页面。在下载页面中找到最新版本的Hadoop软件链接,找到hadoop-3.1.3.tar.gz文件的下载链接。 2.点击下载链接,将文件保存到本地,注意文件的存储位置。 3.解压缩下载好的hadoop-3.1.3.tar.gz压缩包。在终端中输入tar -zxvf hadoop-3.1.3.tar.gz命令,终端会将该压缩包解压到当前目录下。也可以使用解压软件进行解压缩。 4.解压缩之后进入hadoop-3.1.3目录,执行bin/hdfs namenode -format命令进行格式化命名空间,格式化命名空间后才能正常使用。之后执行./sbin/start-dfs.sh和./sbin/start-yarn.sh开启Hadoop运行环境。 总之,下载hadoop-3.1.3.tar.gz是为了安装Hadoop新版并进行数据处理,需要仔细阅读官网上的说明文档以及安装指南,保证安装过程的正确性,提高数据处理效率并提高集群管理能力。 ### 回答3: Hadoop是当前最流行的分布式计算框架之一,它能够支持超大型数据的处理和存储。Hadoop-3.1.3是Hadoop的一个版本,是在先前版本的基础上进行了一些重要的改进和优化。 要下载Hadoop-3.1.3,需要打开Hadoop的官方网站,该网站提供了最新版本的Hadoop的下载链接。从该网站下载Hadoop-3.1.3的文件名为hadoop-3.1.3.tar.gz的压缩包。 首先,要确保计算机上已经安装了必要的组件和依赖项,如Java开发套件(JDK)和Linux操作系统。然后,使用wget或curl等命令行工具从官方网站下载hadoop-3.1.3.tar.gz。可以使用以下命令下载: ```bash $ wget https://downloads.apache.org/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz ``` 或使用curl命令: ```bash $ curl -O https://downloads.apache.org/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz ``` 然后,需要将下载的文件进行解压缩。在命令行界面中,使用以下命令将压缩包解压到当前目录: ```bash $ tar zxvf hadoop-3.1.3.tar.gz ``` 解压缩后,得到一个名为hadoop-3.1.3的目录。该目录包含了Hadoop的所有文件和配置。可以按照官方文档中的说明进行安装、配置和使用Hadoop。 总之,下载Hadoop-3.1.3需要前置条件是安装好 JDK 和 Linux 操作系统。使用命令行工具 wget 或 curl 下载 .tar.gz 压缩包,然后使用 tar 命令解压缩即可得到 Hadoop-3.1.3 目录,该目录包含了Hadoop的所有文件和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值