hive系列(二)深入浅出 有更新!

  |   0 评论   |   1,247 浏览

37套精品Java架构师高并发高性能高可用分布式集群电商缓存性能调优设计项目实战视教程 置顶! 有更新!

Hive深入浅出

一、Hive概述

1. Hive是什么

Hive是基于Hadoop的数据仓库解决方案。由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性,因此使用Hive构建的数据仓库也秉承了这些特性。

这是来自官方的解释。

简单来说,Hive就是在Hadoop上架了一层SQL接口,可以将SQL翻译成MapReduceHadoop上执行,这样就使得数据开发和分析人员很方便的使用SQL来完成海量数据的统计和分析,而不必使用编程语言开发MapReduce那么麻烦。

先上一张经典的Hive架构图:

Hive架构图

如图中所示,Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。
在使用过程中,至需要将Hive看做是一个数据库就行,本身Hive也具备了数据库的很多特性和功能。

2. Hive擅长什么

Hive可以使用HQL(Hive SQL)很方便的完成对海量数据的统计汇总,即席查询和分析,除了很多内置的函数,还支持开发人员使用其他编程语言和脚本语言来自定义函数。

但是,由于Hadoop本身是一个批处理,高延迟的计算框架,Hive使用Hadoop作为执行引擎,自然也就有了批处理,高延迟的特点,在数据量很小的时候,Hive执行也需要消耗较长时间来完成,这时候,就显示不出它与OracleMysql等传统数据库的优势。  

此外,Hive对事物的支持不够好,原因是HDFS本身就设计为一次写入,多次读取的分布式存储系统,因此,不能使用Hive来完成诸如DELETE、UPDATE等在线事务处理的需求。

因此,Hive擅长的是非实时的、离线的、对响应及时性要求不高的海量数据批量计算,即席查询,统计分析。

3. Hive的数据单元

l Databases:数据库。概念等同于关系型数据库的Schema,不多解释;

l Tables:表。概念等同于关系型数据库的表,不多解释;

l Partitions:分区。概念类似于关系型数据库的表分区,没有那么多分区类型,只支持固定分区,将同一组数据存放至一个固定的分区中。

l Buckets (or Clusters):分桶。同一个分区内的数据还可以细分,将相同的KEY再划分至一个桶中,这个有点类似于HASH分区,只不过这里是HASH分桶,也有点类似子分区吧。

4. Hive的数据类型

既然是被当做数据库来使用,除了数据单元,Hive当然也得有一些列的数据类型。这里先简单描述下,后续章节会有详细的介绍。

1) 原始数据类型

n 整型

TINYINT — 微整型,只占用1个字节,只能存储0-255的整数。

SMALLINT– 小整型,占用2个字节,存储范围–32768 到 32767

INT– 整型,占用4个字节,存储范围-21474836482147483647

BIGINT– 长整型,占用8个字节,存储范围-2^632^63-1

n 布尔型

BOOLEAN — TRUE/FALSE

n 浮点型

FLOAT– 单精度浮点数。

DOUBLE– 双精度浮点数。

n 字符串型

STRING– 不设定长度。

2) 复合数据类型

n Structs

一组由任意数据类型组成的结构。比如,定义一个字段C的类型为STRUCT {a INT; b STRING},则可以使用aC.b来获取其中的元素值;

n Maps

Java中的Map没什么区别,就是存储K-V对的;

n Arrays

就是数组而已


二、Hive的数据库和表

先看一张草图:

Hive结构

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

1. Hive在HDFS上的默认存储路径

Hive的数据都是存储在HDFS上的,默认有一个根目录,在hive-site.xml中,由参数hive.metastore.warehouse.dir指定。默认值为/user/hive/warehouse.

2. Hive中的数据库(Database)

进入Hive命令行,执行show databases;命令,可以列出hive中的所有数据库,默认有一个default数据库,进入Hive-Cli之后,即到default数据库下。

使用use databasename;可以切换到某个数据库下,同mysql

hive> show databases;

OK

default

mysqltest

hive> create database boomtest;

OK

Time taken: 1.094 seconds

hive> show databases;

OK

boomtest

default

mysqltest

Time taken: 0.22 seconds, Fetched: 3 row(s)

hive> drop database mysqltest;

OK

Time taken: 0.352 seconds

hive> show databases;

OK

boomtest

default

Time taken: 0.035 seconds, Fetched: 2 row(s)

hive> use boomtest;

OK

Time taken: 0.041 seconds

Hive中的数据库在HDFS上的存储路径为

${hive.metastore.warehouse.dir}/databasename.db

比如,名为lxw1234的数据库存储路径为:

/user/hive/warehouse/lxw1234.db

1) 创建Hive数据库

使用HDFS超级用户,进入Hive-Cli,语法为:

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name

   [COMMENT database_comment]

   [LOCATION hdfs_path]

   [WITH DBPROPERTIES (property_name=property_value, ...)];

比如,创建名为lxw1234的数据库:

CREATE DATABASE IF NOT EXISTS lxw1234

COMMENT 'lxw的大数据田地-lxw1234.com'

localtion 'hdfs://namenode/user/lxw1234/lxw1234.db/';

 

创建时候可以指定数据库在HDFS上的存储位置。

注意:使用HDFS超级用户创建数据库后,该数据库在HDFS上的存储路径的属主为超级用户,如果该数据库是为某个或者某些用户使用的,则需要修改路径属主,或者在Hive中进行授权。

2) 修改数据库属性

ALTER (DATABASE|SCHEMA) database_name

SET DBPROPERTIES (property_name=property_value, );

3) 修改数据库属主

ALTER (DATABASE|SCHEMA) database_name

SET OWNER [USER|ROLE] user_or_role;

4) 删除数据库

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name

[RESTRICT|CASCADE];

默认情况下,Hive不允许删除一个里面有表存在的数据库,如果想删除数据库,要么先将数据库中的表全部删除,要么可以使用CASCADE关键字,使用该关键字后,Hive会自己将数据库下的表全部删除。RESTRICT关键字就是默认情况,即如果有表存在,则不允许删除数据库。

3. Hive中的表(Table)

1) 查看所有的表

进入Hive-Cli,使用use databasename;切换到数据库之后,执行show tables; 即可查看该数据库下所有的表:

hive> show tables;

OK

lxw1

lxw1234

table1

t_site_log

2) 表的存储路径

默认情况下,表的存储路径为:

${hive.metastore.warehouse.dir}/databasename.db/tablename/

可以使用desc formatted tablename;命令查看表的详细信息,其中包括了存储路径:

Location:               hdfs://cdh5/hivedata/warehouse/lxw1234.db/lxw1234

 

3) 内部表和外部表

Hive中的表分为内部表(MANAGED_TABLE)和外部表(EXTERNAL_TABLE)

内部表和外部表最大的区别

内部表DROP时候会删除HDFS上的数据;

外部表DROP时候不会删除HDFS上的数据;

内部表适用场景:

Hive中间表、结果表、一般不需要从外部(如本地文件、HDFSload数据)的情况。

外部表适用场景:

源表,需要定期将外部数据映射到表中。

我们的使用场景:

每天将收集到的网站日志定期流入HDFS文本文件,一天一个目录;

Hive中建立外部表作为源表,通过添加分区的方式,将每天HDFS上的原始日志映射到外部表的天分区中;

在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。

4) 创建表

创建表的语法选项特别多,这里只列出常用的选项。

以一个例子来说吧:

CREATE EXTERNAL TABLE t_lxw1234 (

id INT,

ip STRING COMMENT ‘访问者IP,

avg_view_depth DECIMAL(5,1),

bounce_rate DECIMAL(6,5)

) COMMENT lxw的大数据田地-lxw1234.com

PARTITIONED BY (day STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ,

STORED AS textfile

LOCATION hdfs://cdh5/tmp/lxw1234/';

关键字EXTERNAL

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

关键字COMMENT

为表和列添加注释

关键字PARTITIONED BY

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

关键字ROW FORMAT DELIMITED

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

FIELDS TERMINATED BY ,’ //指定每行中字段分隔符为逗号

LINES TERMINATED BY \n’ //指定行分隔符

COLLECTION ITEMS TERMINATED BY ,’ //指定集合中元素之间的分隔符

MAP KEYS TERMINATED BY :’ //指定数据中Map类型的KeyValue之间的分隔符

举个例子:

create table score(name string, score map<string,int>)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY \t

COLLECTION ITEMS TERMINATED BY ,

MAP KEYS TERMINATED BY :';

要加载的文本数据为:

biansutao ‘数学':80,’语文':89,’英语':95

jobs ‘语文':60,’数学':80,’英语':99

关键字STORED AS

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

TEXTFILE //文本,默认值

SEQUENCEFILE // 二进制序列文件

RCFILE //列式存储格式文件 Hive0.6以后开始支持

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

PARQUET //列出存储格式文件,Hive0.13以后开始支持

关键词LOCATION

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

 

其他请参见Hive官方文档:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable

 

 

 

 

 


三、 Hive的视图和分区

1. Hive中的视图

和关系型数据库一样,Hive中也提供了视图的功能,注意Hive中视图的特性,和关系型数据库中的稍有区别:

· 只有逻辑视图,没有物化视图;

· 视图只能查询,不能Load/Insert/Update/Delete数据;

· 视图在创建时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的那些子查询;

1) 创建视图

CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ) ]

[COMMENT view_comment]

[TBLPROPERTIES (property_name = property_value, )]

AS SELECT ;

 

例如:

 

CREATE VIEW IF NOT EXISTS v_lxw1234 (url COMMENT url)

COMMENT view lxw1234

AS SELECT url FROM lxw1234

WHERE url LIKE http://%

LIMIT 100;

 

2) 删除视图

DROP VIEW IF EXISTS v_lxw1234;

 

3) 修改视图

ALTER VIEW v_lxw1234 AS

SELECT url FROM lxw1234 limit 500;

 

更多关于Hive视图的介绍,请参考官方文档:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Create/Drop/AlterView

2. Hive中的表分区

Hive中的表分区比较简单,就是将同一组数据放到同一个HDFS目录下,当查询中过滤条件指定了某一个分区值时候,只将该分区对应的目录作为Input,从而减少MapReduce的输入数据,提高查询效率。

 

1) 创建分区表

CREATE EXTERNAL TABLE t_lxw1234 (

id INT,

ip STRING COMMENT ‘访问者IP,

avg_view_depth DECIMAL(5,1),

bounce_rate DECIMAL(6,5)

) COMMENT lxw的大数据田地-lxw1234.com

PARTITIONED BY (month STRING, day STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ,

STORED AS textfile;

 

在创建表时候,使用PARTITIONED BY关键字来指定该表为分区表,后面括号中指定了分区的字段和类型,分区字段可以有多个,在HDFS中对应多级目录。

比如,上面的表t_lxw1234分区month=2015-06,day=2015-06-15’对应HDFS上的路径为:/user/hive/warehouse/default.db/t_lxw1234/month=2015-06/day=2015-06-15/,当查询中指定了month=2015-06’ AND day=2015-06-15,MapReduce直接从该目录中读取数据,如果只指定了month=2015-06’,那么MapReduce/month=2015-06/下所有的子目录都作为Input

2) 添加分区

使用INSERT添加分区:

往分区中追加数据:

INSERT INTO TABLE t_lxw1234 PARTITION (month = 2015-06,day = 2015-06-15)

SELECT * FROM dual;

覆盖分区数据:

INSERT overwrite TABLE t_lxw1234 PARTITION (month = 2015-06,day = 2015-06-15)

SELECT * FROM dual;

使用ALTER TABLE添加分区:

ALTER TABLE t_lxw1234 ADD PARTITION (month = 2015-06,day = 2015-06-15) location hdfs://namenode/tmp/lxw1234/month=2015-06/day=2015-06-15/';

3) 查看分区对应的HDFS路径

使用命令 show partitions t_lxw1234; 查看表的所有分区:

hive> show partitions t_lxw1234;

OK

month=2015-01/day=2015-01-25

month=2015-01/day=2015-01-31

month=2015-02/day=2015-02-15

month=2015-02/day=2015-02-28

month=2015-03/day=2015-03-15

month=2015-03/day=2015-03-31

使用desc formatted t_lxw1234 partition (month = 2015-01’ , day = 2015-01-25);

查看该分区的详细信息,包括该分区在HDFS上的路径:

Location:               hdfs://namenode/user/hive/warehouse/default.db/t_lxw1234/month=2015-01/day=2015-01-25/

4) 删除分区

可以使用 ALTER TABLE t_lxw1234 DROP PARTITION (month = 2015-01, day = 2015-01-25);

删除一个分区;

同内部表和外部表,如果该分区表为外部表,则分区对应的HDFS目录数据不会被删除。

更多关于分区的介绍,可参考官方文档:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AddPartitions

Hive提供的几种用户交互接口中,最常用的就是命令行接口。本文简单介绍一下Hive命令行接口(Hive Command Line)Hive交互Shell(Hive Interactive Shell)的一些使用。

3. 动态分区

关系型数据库(如Oracle)中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用Hive的动态分区,需要进行相应的配置。

先看一个应用场景,源表t_lxw1234的数据如下:

 

SELECT day,url FROM t_lxw1234;

2015-05-10      url1

2015-05-10      url2

2015-06-14      url1

2015-06-14      url2

2015-06-15      url1

2015-06-15      url2

……

 

 

目标表为:

CREATE TABLE t_lxw1234_partitioned (

url STRING

) PARTITIONED BY (month STRING,day STRING) 

stored AS textfile;

 

需求:将t_lxw1234中的数据按照时间(day),插入到目标表t_lxw1234_partitioned的相应分区中。

如果按照之前介绍的往指定一个分区中Insert数据,那么这个需求很不容易实现。

这时候就需要使用动态分区来实现,使用动态分区需要注意设定以下参数:

hive.exec.dynamic.partition

默认值:false

是否开启动态分区功能,默认false关闭。

使用动态分区时候,该参数必须设置成true;

hive.exec.dynamic.partition.mode

默认值:strict

动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。

一般需要设置为nonstrict

hive.exec.max.dynamic.partitions.pernode

默认值:100

在每个执行MR的节点上,最大可以创建多少个动态分区。

该参数需要根据实际的数据来设定。

比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。

hive.exec.max.dynamic.partitions

默认值:1000

在所有执行MR的节点上,最大一共可以创建多少个动态分区。

同上参数解释。

hive.exec.max.created.files

默认值:100000

整个MR Job中,最大可以创建多少个HDFS文件。

一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。

hive.error.on.empty.partition

默认值:false

当有空分区生成时,是否抛出异常。

一般不需要设置。

 

那么,上面的需求可以使用如下的语句来完成:

SET hive.exec.dynamic.partition=true;  

SET hive.exec.dynamic.partition.mode=nonstrict; 

SET hive.exec.max.dynamic.partitions.pernode = 1000;

SET hive.exec.max.dynamic.partitions=1000;

 

INSERT overwrite TABLE t_lxw1234_partitioned PARTITION (month,day) 

SELECT url,substr(day,1,7) AS month,day 

FROM t_lxw1234;

 

注意:在PARTITION (month,day)中指定分区字段名即可;

SELECT子句的最后两个字段,必须对应前面PARTITION (month,day)中指定的分区字段,包括顺序。

执行结果如下:

Loading data to table liuxiaowen.t_lxw1234_partitioned partition (month=null, day=null)

Loading partition {month=2015-05, day=2015-05-10}

Loading partition {month=2015-06, day=2015-06-14}

Loading partition {month=2015-06, day=2015-06-15}

Partition liuxiaowen.t_lxw1234_partitioned{month=2015-05, day=2015-05-10} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]

Partition liuxiaowen.t_lxw1234_partitioned{month=2015-06, day=2015-06-14} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]

Partition liuxiaowen.t_lxw1234_partitioned{month=2015-06, day=2015-06-15} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]

 

使用show partitions t_lxw1234_partitioned;查看目标表有哪些分区:

hive> show partitions t_lxw1234_partitioned;

OK

month=2015-05/day=2015-05-10

month=2015-06/day=2015-06-14

month=2015-06/day=2015-06-15

4. 数据加载

Hive中建好表之后,需要将数据加载进来,以便做后续查询分析,本文介绍向Hive表中加载数据的几种方式。

1) 建表时候直接指定

如果你的数据已经在HDFS上存在,已经为结构化数据,并且数据所在的HDFS路径不需要维护,那么可以直接在建表的时候使用location指定数据所在的HDFS路径即可。

比如:

CREATE [EXTERNAL] TABLE t_lxw1234 (

day STRING,

url STRING)

ROW FORMAT DELIMITED 

FIELDS TERMINATED BY ' ' 

stored as textfile 

location '/tmp/lxw1234/';

 

这里内部表和外部表都可以指定,但需要注意,如果是内部表,那么在DROP该表的时候,同时会将LOCATION所指定的目录一起删除。

 

2) 从本地文件系统或者HDFS的一个目录中加载

如果数据在本地,或者HDFS的某一个目录下,需要加载到目标中或分区中,那么使用LOAD DATA命令即可加载数据:

加载本地文件

LOAD DATA LOCAL INPATH /home/lxw1234/t_lxw1234/

INTO TABLE t_lxw1234 PARTITION (day = 2015-06-15);

加载HDFS文件

LOAD DATA INPATH /user/lxw1234/t_lxw1234/

INTO TABLE t_lxw1234 PARTITION (day = 2015-06-15);

3) 从一个子查询中加载数据

这个比较简单,就是将一个查询结果插入到目标表或分区中:

INSERT overwrite TABLE t_lxw1234 PARTITION (day = 2015-06-15)

SELECT day,url from source_table;

4) 导出Hive中的数据到文件系统

这里也介绍一下从Hive中导出数据到文件系统(HDFS和本地文件系统)

语法为:

INSERT OVERWRITE [LOCAL] DIRECTORY directory1

  [ROW FORMAT row_format] [STORED AS file_format] 

  SELECT ... FROM ...

如果指定了LOCAL关键字,则为导出到本地文件系统,否则,导出到HDFS
使用ROW FORMAT关键字可以指定导出的文件分隔符,比如:

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/lxw1234/' 

  ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 

SELECT * FROM t_lxw1234;

该语句将t_lxw1234表的所有数据导出到本地文件系统/tmp/lxw1234/目录,字段间的分隔符为逗号。

cat /tmp/lxw1234/000000_0
2015-05-10,url1
2015-05-10,url2
2015-06-14,url1
2015-06-14,url2
2015-06-15,url1
2015-06-15,url2

更多关于Hive数据加载和导出的介绍,请参考官方文档:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Loadingfilesintotables


四、使用Hive命令行

5. 7.1 Hive Command Line

输入$HIVE_HOME/bin/hive 或者 –help可以显示帮助选项:

 

-d,define <key=value>

定义一个变量值,这个变量可以在Hive交互Shell中引用,后面会介绍用法,比如:-d A=B

database <databasename>

进入Hive交互Shell时候指定数据库,默认进入default数据库

-e <quoted-query-string>

命令行执行一段SQL语句

-f <filename>

filename文件中保存HQL语句,执行其中的语句

-H,help

显示帮助信息

-h <hostname>

连接远程Hive Server,后续介绍

hiveconf <property=value>

在命令行中设置Hive的运行时配置参数,优先级高于hive-site.xml,但低于Hive交互Shell中使用Set命令设置。

hivevar <key=value>

同—define

-i <filename>

进入Hive交互Shell时候先执行filename中的HQL语句

-p <port>

连接远程Hive Server的端口号

-S,silent

静默模式,指定后不显示执行进度信息,最后只显示结果

-v,verbose

冗余模式,额外打印出执行的HQL语句

 

这里特别介绍一下以下几个选项:

· -d,–define <key=value>

执行$HIVE_HOME/bin/hive -d k1=v1 database lxw1234

表示,定义了一个变量k1,值为v1,执行了数据库为lxw1234

进入Hive交互Shell之后,可以使用${k1}来引用该变量,比如:

hive> select ${k1}’ from t_lxw1234 limit 1;

OK

v1

这里将k1的值v1打印出来。

· –hiveconf <property=value>

可以使用该选项设定Hive的运行参数配置,相当于在Hive交互Shell中使用set命令进行设置,比如:

执行$HIVE_HOME/bin/hive hiveconf mapred.reduce.tasks=20

进入交互Shell之后,运行的所有查询都会设置20reduce task

除非又用set mapred.reduce.tasks=N;进行另外设定。

· –hivevar <key=value>

用法同-d和—define

 

6. 7.2 Hive交互Shell

Hive交互Shell指执行$HIVE_HOME/bin/hive之后,进入的有hive>提示符的交互式命令行,在这里可以执行查询语句,设置参数等等,所有的命令必须以分号结束,具体有以下命令和选项:

· quit

退出交互Shell

· exit

退出交互Shell

· reset

重置所有的Hive运行时配置参数,比如,之前使用set命令设置了reduce数量,使用reset之后,重置成hive-site.xml中的配置。

· set <key>=<value>

设置Hive运行时配置参数,优先级最高,相同key,后面的设置会覆盖前面的设置。

· set –v

打印出所有Hive的配置参数和Hadoop的配置参数。

· add命令

包括 add FILE[S] <filepath> <filepath>* 、 add JAR[S] <filepath> <filepath>* add ARCHIVE[S] <filepath> <filepath>*

DistributeCache中添加一个或过个文件、jar包、或者归档,添加之后,可以在MapReduce task中使用。

比如,自定义一个udf函数,打成jar包,在创建函数之前,必须使用add jar命令,将该jar包添加,否则会报错找不到类。

 

· list 命令

包括 list FILE[S] list JAR[S]  list ARCHIVE[S]

列出当前DistributeCache中的文件、jar包或者归档。

· delete 命令

包括 delete FILE[S] <filepath>* delete JAR[S] <filepath>*  、 delete ARCHIVE[S] <filepath>*

DistributeCache中删除文件

· ! <command>

在交互Shell中执行Linux操作系统命令并打印出结果,不常用

比如:

hive> !pwd;

/home/lxw1234

· dfs <dfs command>

在交互Shell中执行hadoop fs 命令,不常用

比如,统计hdfs文件系统中/tmp/目录的总大小:

hive> dfs -du -s /tmp/;

54656194751 /tmp

· <query string>

最常用的,执行HQL语句,以分号结尾;

· source FILE <filepath>

在交互Shell中执行一个脚本,不常用。

 

 

 

 

 


评论

发表评论

validate