3.2.1 数据仓库工具 -- Hive(安装配置、建库建表、数据导入导出)_hive建表工具-程序员宅基地

技术标签: hive  

3.2.1 数据仓库工具 – Hive



一、Hive概述

1. Hive的优点

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

2.Hive的缺点

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

3.Hive架构

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

二、Hive安装与配置

2.1 Hive安装配置

Hive官网:http://hive.apache.org
下载网址:http://archive.apache.org/dist/hive/
文档网址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual

在这里插入图片描述

# 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

其中rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm 报如下错误解决方式:
在这里插入图片描述
原因:这是由于yum安装了旧版本的GPG keys造成的
解决办法:后面加上 --force --nodeps 问题解决

rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm --force --nodeps

4、启动数据库

systemctl start mysqld

5、查找root密码

grep password /var/log/mysqld.log

6、修改 root 口令
# 进入MySQL,使用前面查询到的口令 
mysql -u root -p 

#mysql下执行
# 设置口令强度;将root口令设置为12345678;刷新 
set global validate_password_policy=0; 
set password for 'root'@'localhost' =password('12345678'); flush privileges;

在这里插入图片描述

本地连接不上云服务器:

#mysql下
use mysql
update user set host='%' where user='root' and host='localhost';
#重启mysql
7、创建 hive 用户
-- mysql下
mysql -u root -p

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

2.1.2、Hive 安装

安装步骤:
 1、下载、上传、解压缩 
 2、修改环境变量 
 3、修改hive配置 
 4、拷贝JDBC的驱动程序 
 5、初始化元数据库
1、下载Hive软件,并解压缩
cd /opt/lagou/software 
[root@linux03 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 文件中增加环境变量 
vim /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 
vim hive-site.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration> 
  <!-- hive元数据的存储位置 -->  
  <property> 
    <name>javax.jdo.option.ConnectionURL</name>  
    <value>jdbc:mysql://linux03: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>12345678</value>  
    <description>password to use against metastore database</description> 
  </property> 
</configuration>

备注:

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

4、拷贝 MySQL JDBC 驱动程序

将 mysql-connector-java-5.1.46.jar 拷贝到 $HIVE_HOME/lib

[root@linux03 software]# cp mysql-connector-java-5.1.46.jar $HIVE_HOME/lib

5、初始化元数据库
[root@linux123 ~]# cd $HIVE_HOME/bin
[root@linux123 bin]# schematool -dbType mysql -initSchema
6、启动Hive,执行命令
# 启动hive服务之前,请先启动hdfs、yarn的服务 
[root@linux123 ~]$ hive 
hive> show functions;

在这里插入图片描述

2.1.3、Hive 属性配置

可在 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>
显示表头属性
<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满足如下条件才能真正使用本地模式:
在这里插入图片描述

Hive的日志文件

Hive的log默认存放在 /tmp/root 目录下(root为当前用户名);这个位置可以修改。

vim $HIVE_HOME/conf/hive-log4j2.properties 

> 将以下内容
> #property.hive.log.dir = ${
    sys:java.io.tmpdir}/${
    sys:user.name}
改为:property.hive.log.dir = /opt/lagou/servers/hive-2.3.7/logs

可以不修改,但是要知道位置。
在这里插入图片描述
附录:添加第三方用户(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用户
在这里插入图片描述

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进程有效;
配置文件的设定对本机所有启动的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.2 Hive命令

1、Hive

在这里插入图片描述
-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语言中一样,会支持多种不同长度的整型和浮点类型数据,同时也支持布尔类型、字符串类型,时间戳数据类型以及二进制数组数据类型等。详细信息见下表:
在这里插入图片描述
这些类型名称都是 Hive 中保留字。这些基本的数据类型都是 java 中的接口进行实现的,因此与 java 中数据类型是基本一致的:
在这里插入图片描述
数据类型的隐式转换
Hive的数据类型是可以进行隐式转换的,类似于Java的类型转换。如用户在查询中将一种浮点类型和另一种浮点类型的值做对比,Hive会将类型转换成两个浮点类型中值较大的那个类型,即:将FLOAT类型转换成DOUBLE类型;当然如果需要的话,任意整型会转化成DOUBLE类型。 Hive 中基本数据类型遵循以下层次结构,按照这个层次结构,子类型到祖先类型允许隐式转换。
在这里插入图片描述
在这里插入图片描述

hive> select '1.0'+2; 
OK3.0 
hive> select '1111' > 10; 
hive> select 1 > 0.8;

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

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

hive> select cast('1111' as int); 
OK1111

第 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;

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

第 4 节 读时模式

在这里插入图片描述

四、 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 databases; 

-- 查看数据库信息 
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];

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

第 3 节 内部表 & 外部表

在这里插入图片描述
内部表
t1.dat文件内容

2;zhangsan;book,TV,code;beijing:chaoyang,shagnhai:pudong 
3;lishi;book,code;nanjing:jiangning,taiwan:taibei 
4;wangwu;music,book;heilongjiang:haerbin

创建表 SQL

-- 创建内部表
create table t1(
    id int,
    name string,
    hobby array<string>,
    addr map<string, string>
)
row format delimited
fields terminated by ";"
collection items terminated by ","
map keys terminated by ":";

-- 显示表的定义,显示的信息较少
desc t1;
 
-- 显示表的定义,显示的信息多,格式友好
desc formatted t1;
 
-- 加载数据
load data local inpath '/home/hadoop/data/t1.dat' into table t1;
 
-- 查询数据
select * from t1;
 
-- 查询数据文件
dfs -ls /user/hive/warehouse/mydb.db/t1;
 
-- 删除表。表和数据同时被删除
drop table t1;
 
-- 再次查询数据文件,已经被删除

外部表

-- 创建外部表
create external table t2(
id int,
name string,
hobby array<string>,
addr map<string, string>
)
row format delimited
fields terminated by ";"
collection items terminated by ","
map keys terminated by ":";
 
-- 显示表的定义
desc formatted t2;
 
-- 加载数据
load data local inpath '/home/hadoop/data/t1.dat' into table t2;
 
-- 查询数据
select * from t2;
 
-- 删除表。表删除了,目录仍然存在
drop table t2;
 
-- 再次查询数据文件,仍然存在

内部表与外部表的转换

-- 创建内部表,加载数据,并检查数据文件和表的定义
create table t1(
id int,
name string,
hobby array<string>,
addr map<string, string>
)
row format delimited
fields terminated by ";"
collection items terminated by ","
map keys terminated by ":";
 
load data local inpath '/home/hadoop/data/t1.dat' into table t1;
 
dfs -ls /user/hive/warehouse/mydb.db/t1;
 
desc formatted t1;
 
-- 内部表转外部表
alter table t1 set tblproperties('EXTERNAL'='TRUE');
 
-- 查询表信息,是否转换成功
desc formatted t1;
 
-- 外部表转内部表。EXTERNAL 大写,false 不区分大小
alter table t1 set tblproperties('EXTERNAL'='FALSE');
 
-- 查询表信息,是否转换成功
desc formatted t1;

在这里插入图片描述

第 4 节 分区表

在这里插入图片描述
分区表创建与数据加载

-- 创建分区表, 关键字partitioned 
create table if not exists t3(
 id    int
 ,name  string
 ,hobby  array<string>
 ,addr  map<String,string>
)
partitioned by (dt string)
row format delimited
fields terminated by ';'
collection items terminated by ','
map keys terminated by ':';
 
-- 加载数据。
load data local inpath "/home/hadoop/data/t1.dat" into table t3 partition(dt="2020-06-01");
 
load data local inpath "/home/hadoop/data/t1.dat" into table t3 partition(dt="2020-06-02");

备注:分区字段不是表中已经存在的数据,可以将分区字段看成伪列
查看分区

show partitions t3;

新增分区并设置数据

-- 增加一个分区,不加载数据
alter table t3 add partition(dt='2020-06-03');
 
-- 增加多个分区,不加载数据
alter table t3
add partition(dt='2020-06-05') partition(dt='2020-06-06');
 
-- 增加多个分区。准备数据
hdfs dfs -cp /user/hive/warehouse/mydb.db/t3/dt=2020-06-01 /user/hive/warehouse/mydb.db/t3/dt=2020-06-07
hdfs dfs -cp /user/hive/warehouse/mydb.db/t3/dt=2020-06-01 /user/hive/warehouse/mydb.db/t3/dt=2020-06-08
 
-- 增加多个分区。加载数据
alter table t3 add
partition(dt='2020-06-07') 
location '/user/hive/warehouse/mydb.db/t3/dt=2020-06-07'
 
partition(dt='2020-06-08') 
location '/user/hive/warehouse/mydb.db/t3/dt=2020-06-08';
 
-- 查询数据
select * from t3;

修改分区的hdfs路径

alter table t3 partition(dt='2020-06-01') set location '/user/hive/warehouse/t3/dt=2020-06-03';

删除分区

-- 可以删除一个或多个分区,用逗号隔开 
alter table t3 drop partition(dt='2020-06-03'), partition(dt='2020-06-04');

第 5 节 分桶表

在这里插入图片描述

-- 测试数据
1 java 90
1 c 78
1 python 91
1 hadoop 80
2 java 75
2 c 76
2 python 80
2 hadoop 93
3 java 98
3 c 74
3 python 89
3 hadoop 91
5 java 93
6 c 76
7 python 87
8 hadoop 88
-- 创建分桶表
create table course(
id int,
name string,
score int
)
clustered by (id) into 3 buckets
row format delimited fields terminated by "\t";
 
-- 创建普通表
create table course_common(
id int,
name string,
score int
)
row format delimited fields terminated by "\t";
 
-- 普通表加载数据
load data local inpath '/home/hadoop/data/course.dat' into table course_common;
 
-- 通过 insert ... select ... 给桶表加载数据
insert into table course select * from course_common;
 
-- 观察分桶数据。数据按照:(分区字段.hashCode) % (分桶数) 进行分区

在这里插入图片描述

在这里插入图片描述

第 6 节 修改表 & 删除表

-- 修改表名。rename
alter table course_common
rename to course_common1;
 
-- 修改列名。change column
alter table course_common1
change column id cid int;
 
-- 修改字段类型。change column
alter table course_common1
change column cid cid string;
-- 报错 The following columns have types incompatible with the existing columns in their respective positions
-- 修改字段数据类型时,要满足数据类型转换的要求。如int可以转为string,但是string不能转为int
 
-- 增加字段。add columns
alter table course_common1
add columns (common string);
 
-- 删除字段:replace columns, 要保留的写在下面, 要删除的不写, 另外该步骤还可以改字段名
-- 这里仅仅只是在元数据中删除了字段,并没有改动hdfs上的数据文件
alter table course_common1
replace columns(
id string, cname string, score int);
 
-- 删除表
drop table course_common1;

在这里插入图片描述

五、 HQL操作之–数据操作

第 1 节 数据导入

装载数据(Load)
基本语法:

LOAD DATA [LOCAL] INPATH 'filepath'
[OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

在这里插入图片描述
在这里插入图片描述
准备工作:

-- 创建表
CREATE TABLE tabA ( 
id int
,name string
,area string 
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
 
数据文件(~/data/sourceA.txt):
1,fish1,SZ
2,fish2,SH
3,fish3,HZ
4,fish4,QD
5,fish5,SR
 
-- 拷贝文件到 HDFS
hdfs dfs -put sourceA.txt data/

装载数据:

-- 加载本地文件到hive(tabA)
LOAD DATA LOCAL INPATH '/home/hadoop/data/sourceA.txt'
INTO TABLE tabA;
 
-- 检查本地文件还在
 
-- 加载hdfs文件到hive(tabA)
LOAD DATA INPATH 'data/sourceA.txt'
INTO TABLE tabA;
 
-- 检查HDFS文件,已经被转移
 
-- 加载数据覆盖表中已有数据
LOAD DATA INPATH 'data/sourceA.txt'
OVERWRITE INTO TABLE tabA;
 
-- 创建表时加载数据
hdfs dfs -mkdir /user/hive/tabB
hdfs dfs -put sourceA.txt /user/hive/tabB
CREATE TABLE tabB ( 
id INT
,name string
,area string 
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
Location '/user/hive/tabB';

插入数据(Insert)

-- 创建分区表
CREATE TABLE tabC ( 
id INT
,name string
,area string 
)
partitioned by (month string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
 
-- 插入数据
insert into table tabC
partition(month='202001')
values (5, 'wangwu', 'BJ'), (4, 'lishi', 'SH'), (3, 'zhangsan', 'TJ');
 
-- 插入查询的结果数据
insert into table tabC partition(month='202002')
select id, name, area from tabC where month='202001';
 
-- 多表(多分区)插入模式, 下面overwrite覆盖的是分区表中的数据
from tabC
insert overwrite table tabC partition(month='202003')
select id, name, area where month='202002'
insert overwrite table tabC partition(month='202004')
select id, name, area where month='202001'or month='202002';

创建表并插入数据(as select)

-- 根据查询结果创建表 
create table if not exists tabD as select * from tabC;

使用import导入数据

import table student2 partition(month='201709') from '/user/hive/warehouse/export/student';

第 2 节 数据导出

-- 将查询结果导出到本地
insert overwrite local directory '/home/hadoop/data/tabC'
select * from tabC;
 
-- 将查询结果格式化输出到本地
insert overwrite local directory '/home/hadoop/data/tabC2'
row format delimited fields terminated by ' '
select * from tabC;
 
-- 将查询结果导出到HDFS
insert overwrite directory '/user/hadoop/data/tabC3'
row format delimited fields terminated by ' '
select * from tabC;
 
-- dfs 命令导出数据到本地。本质是执行数据文件的拷贝
dfs -get /user/hive/warehouse/mydb.db/tabc/month=202001 /home/hadoop/data/tabC4
 
-- hive 命令导出数据到本地。执行查询将查询结果重定向到文件
hive -e "select * from tabC" > a.log                                            "
 
-- export 导出数据到HDFS。使用export导出数据时,不仅有数还有表的元数据信息
export table tabC to '/user/hadoop/data/tabC4';
 
-- export 导出的数据,可以使用 import 命令导入到 Hive 表中
-- 使用 like tname创建的表结构与原表一致。create ... as select ... 结构可能不一致
create table tabE like tabc;
import table tabE from '/user/hadoop/data/tabC4';
 
-- 截断表,清空数据。(注意:仅能操作内部表)
truncate table tabE;
 
alter table tabC set tblproperties("EXTERNAL"="TRUE");
-- 以下语句报错,外部表不能执行 truncate 操作
truncate table tabC;

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_47134119/article/details/113317252

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签