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

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法