Hive - 常用命令

本文深入探讨了Hive数据库的基本操作,包括创建表、删除表、修改表、加载数据以及使用命令行交互模式等核心功能。详细介绍了如何创建普通表、带有分区的表、带Bucket的表和外部表,以及如何对表进行增删改操作。同时,阐述了数据加载的方法和注意事项。此外,还展示了如何在Hive交互模式下执行查询和命令,以及如何设置日志级别。最后,通过实例演示了Hive的join操作和如何查看查询使用的MapReduce作业数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建表

 创建表的语句:
 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_buckets BUCKETS] 
 [ROW FORMAT row_format] 
 [STORED AS file_format] 
 [LOCATION hdfs_path]
 参数说明
   CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常。
   EXTERNAL         可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。 这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。    STORED AS  如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。
   PARTITIONED BY 有分区的表可以在创建的时候使用PARTITIONED BY 语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。而且,表和分区都可以对某  个列进行 CLUSTERED BY 操作,将若干个列放入一个桶(bucket)中。也可以利用SORT BY 对数据进行排序。这样可以为特定应用提高性能。
  创建表示例
  
创建普通的表
  hive> CREATE TABLE cite(citing INT,cited INT)
      > ROW FORMAT DELIMITED
      > FIELDS TERMINATED BY ','
      > STORED AS TEXTFILE;
      OK
     Time taken: 0.939 seconds<span style="font-family: 华文仿宋;">    </span>
注: 1.hive只支持单个字符的分隔符
       2.hive默认的分隔符是\001
       3.HiveQL语句使用分号表示结束
  
创建带有partition的表:
create table test_partition (id int,name string,no int)
partitioned by (dt string)  
row format delimited fields terminated by ',' 
stored as textfile ;
load data local inpath '/home/localhost/cite.txt'
overwrite into table test_partition partition (dt='2012-03-05');

创建带有Bucket的表:
create table test_bucket (id int,name string,no int)
partitioned by (dt string) 
clustered by (id) into 3 buckets 
row format delimited fields terminated by ',' stored as textfile ;

创建external表:
create external table test_external (id int,name string,no int) 
row format delimited fields terminated by ',' 
location '/home/zhangxin/hive/test_hive.txt';
  
创建与已知表相同结构的表 Like:只复制表的结构,而不复制表的内容。
 create table test_like_table like test_bucket;

2. 删除表
 
   Drop Table tablename;
  注:删除一个内部表的同时会同时删除表的元数据和数据。删除一个外部表,只删除元数据而保留数据。

3. 修改已经存在的表

   Alter table 语句允许用户改变现有表的结构。用户可以增加列/分区、表本身重命名。

  增加分区 Add Partitions:
   可以用 ALTER TABLE ADD PARTITION 来向一个表中增加分区
 alter table test_partition add partition (dt='2014-09-06')  location '/home/zz/hive/test_hive.txt';

   注:分区名加引号

  删除分区 drop Partition
  用户可以用 ALTER TABLE DROP PARTITION 来删除分区。分区的元数据和数据将被一并删除。

 对表进行重命名 rename to
 ALTER TABLE table_name RENAME TO new_table_name
 这个命令可以让用户为表更名。数据所在的位置和分区名并不改变。换而言之,老的表名并 未“释放”,对老表的更改会改变新表的数据。
  alter table test_partition rename to new_test_partition;

对表中的某一列进行修改,包括列的名称/列的数据类型/列的位置/列的注释
 ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type  [COMMENT col_comment] [FIRST|AFTER column_name]
这个命令可以允许用户修改一个列的名称、数据类型、注释或者位置
create table test_col_change (a int,b int, c int);

注:修改列的名称,后面一定要加上数据类型:
   ALTER TABLE test_col_change CHANGE a a1 INT; 将 a 列的名字改为 a1.
   ALTER TABLE test_col_change CHANGE a a1 STRING AFTER b; 将 a 列的名字改为 a1,a 列的数据类型改为 string,并将它放置在列 b 之后。新的表结构为: b int, a1 string, c int.
   ALTER TABLE test_col_change CHANGE b b1 INT FIRST; 会将 b 列的名字修改为 b1, 并将它放在第一列。新表的结构为: b1 int, a string, c int.

   注:对列的改变只会修改 Hive 的元数据,而不会改变实际数据。用户应该确定保证元数据定义和实际数据结构的一致性。

添加/替换列Add/Replace Columns
    ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
   ADD COLUMNS 允许用户在当前列的末尾增加新的列,但是在分区列之前。

alter table test_col_change add columns (d int);
describe test_col_change;
OK
a1    int    
b1    string    
c    int    
d    int    


REPLACE COLUMNS 删除以后的列,加入新的列。只有在使用 native 的 SerDE(DynamicSerDe or MetadataTypeColumnsetSerDe)的时候才可以这么做。
alter table test_col_change replace columns (c int);
describe test_col_change;                           
OK
c    int    

修改表的属性Alter Table Properties:
   ALTER TABLE table_name SET TBLPROPERTIES table_properties 
   table_properties: : (property_name = property_value, property_name = property_value, ... )
用户可以用这个命令向表中增加 metadata,目前 last_modified_user,last_modified_time 属性都是由 Hive 自动管理的。用户可以向列表中增加自己的属性。可以使用 DESCRIBE EXTENDED TABLE 来获得这些信息。
   alter table test_col_change set tblproperties ('key1'='value1');
可以通过 describe extended  test_col_change; 查看表的属性信息。

修改表的序列化和反序列化属性:
ALTER TABLE table_name SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties]
ALTER TABLE table_name SET SERDEPROPERTIES serde_properties
serde_properties: : (property_name = property_value, property_name = property_value, ... )

这个命令允许用户向 SerDe 对象增加用户定义的元数据。Hive 为了序列化和反序列化数据,将会初始化 SerDe 属性,并将属性传给表的 SerDe。如此,用户可以为自定义的 SerDe 存储属性。

修改表的文件存储格式组织方式:
ALTER TABLE table_name SET FILEFORMAT file_format
ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)] INTO num_buckets BUCKETS
这个命令修改了表的物理存储属性。


4.将数据加载到表中

    LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
   
     当数据被加载至表中时,不会对数据进行任何转换。Load 操作只是将数据复制/移动至 Hive 表对应的位置。
     filepath 可以是:
        相对路径,例如:project/data1
        绝对路径,例如: /user/hive/project/data1
        包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1

       加载的目标可以是一个表或者分区。如果表包含分区,必须指定每一个分区的分区名。filepath 可以引用一个文件(这种情况下,Hive 会将文件移动到表所对应的目录中)或者是一个目录(在这种情况下,Hive 会将目录中的所有文件移动至表所对应的目录中)。
       如果指定了 LOCAL,那么:load 命令会去查找本地文件系统中的 filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也可以为本地文件指定一个完整的 URI,比如:file:///user/hive/project/data1.load 命令会将 filepath 中的文件复制到目标文件系统中。
 
      目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置。如果没有指定 LOCAL 关键字,如果 filepath 指向的是一个完整的 URI,hive 会直接使用这个 URI。 如果没有指定 schema 或者 authority,Hive 会使用在 hadoop 配置文件中定义的 schema 和 authority,fs.default.name 指定了 Namenode 的 URI。
       如果路径不是绝对的,Hive 相对于 /user/ 进行解释。Hive 会将 filepath 中指定的文件内容移动到 table (或者 partition)所指定的路径中。
       如果使用了 OVERWRITE 关键字,则目标表(或者分区)中的内容(如果有)会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。

5. Hive命令行 

  执行HQL查询       hive -e "select * from tb"
  查询结果输出为文本   hive -e "select * from tb" > tb.txt
  执行HQL语句文件后,不会进入交互模式   hive -f  hive-script.sql
  执行HQL语句文件后,会进入交互模式   hive -i  hive-script.sql
  设置Hive的日志级别   hive -hiveconf hive.root.logger=INFO


  Hive交互模式
     通过hive命令,进入交互模式
      quit/exit                       退出Hive的交互模式
      set -v                           显示Hive中的所有变量
      set <key>=<value>     设置参数
      !<cmd>                       Hive交互模式下执行shell命令   
                                          例如(查看linux根目录下文件列表):"!ls -l /;"
    dfs <dfs command>    Hive交互模式下执行hadoop fs命令
     <query string>             执行查询并输出到标准输出
     add FILE <value>        增加一个文件到资源列表
      list FILE                       列出所有已经添加的资源


6. join 操作
 内连接
 hive> SELECT sales.*, things.* FROM sales JOIN things ON (sales.id = things.id);
  
查看hive为某个查询使用多少个MapReduce作业
hive> Explain SELECT sales.*, things.* FROM sales JOIN things ON (sales.id = things.id);


外连接

hive> SELECT sales.*, things.* FROM sales LEFT OUTER JOIN things ON (sales.id = things.id);
hive> SELECT sales.*, things.* FROM sales RIGHT OUTER JOIN things ON (sales.id = things.id);
hive> SELECT sales.*, things.* FROM sales FULL OUTER JOIN things ON (sales.id = things.id);



<think>首先,用户的问题是:“我想了解Hive和hide命令中特定参数的含义请问Hive-e参数用法ANDhide-f参数作用”。这里似乎有个typo,可能是"hide"应该被读作"hive",因为引用中多次出现"hive",而不是"hide"。引用[1]中提到了"hive-e"和"hive-f",引用[2]也提到了"hive",引用[3]提到了一些参数但主要是关于MongoDB导出工具的。用户写的是"Hiveandhide",但结合上下文,很可能是"Hive"。我将假设是"Hive"。用户想了解两个特定参数的含义:1.Hive的`-e`参数的用法2.Hive的`-f`参数的作用(用户写了"hide-f",但可能只是拼写错误)引用[1]提供了信息:-"Hive命令hive-e"命令"hide-f"文件名"(文件中书写命令)"–这里也有"hide",应该是"hive"。应该是"hive-f"。-它还提到了其他参数如`-S`,但焦点是`-e`和`-f`。-"Hive命令参数hive-help:查看帮助hive-S静默模式,一般和-e-f一起使用"所以,我将解释:-`hive-e"command"`:直接执行一个HiveSQL命令-`hive-f"filename"`:执行一个包含HiveSQL命令的文件引用[2]是关于Hive的"hbase.columns.mapping.prefix.hide"属性,用于Hive表定义中,处理HBase列的前缀。这相关,但不是直接针对`-e`和`-f`。可能可以忽略,除非需要额外上下文。引用[3]是关于MongoDB导出工具的参数,如CSV选项,与Hive无关,不相关。根据系统指令:-行内数学表达式用`$...$`,但这里没有数学。-独立公式用`$$...$$`,但这里不需要公式。-LaTeX语法正确:无需要。-使用中文回答。-生成相关问题。-引用段落末尾添加引用标识,如`[^1]`。-回答结构清晰,逐步解决问题。回答结构:-清晰解释参数用法。-步骤式回答:先介绍,然后详细解释每个参数。-添加相关问题。组织回答:1.**介绍**:简述Hive命令行工具。2.**解释`hive-e`参数**:-描述用法:直接在命令行执行SQL命令-举例。-引用[1]提到:"Hive命令hive-e"命令"..."–参考这个。3.**解释`hive-f`参数**:-描述用法:执行SQL脚本文件。-举例。-引用[1]:"hive-f"文件名"..."4.**其他相关信息**:-提到`-S`参数用于静默模式,常与`-e`或`-f`一起使用。-引用[1]说"hive-S静默模式,一般和-e-f一起使用"。5.**生成相关问题**:在回答末尾添加。确保中文。结束回答中添加引用标识:引用[1]的末尾添加`[^1]`。相关问题应基于主题生成。完整回答大纲:-开头:Hive命令行工具提供多个参数来运行查询或脚本。-解释`-e`:-用法:`hive-e"sql_command"`-作用:直接从命令行执行SQL查询。-例如:`hive-e"SELECT*FROMusers;"`运行一个查询。-参考引用[^1].-解释`-f`:-用法:`hive-fscript.sql`-作用:执行文件中的SQL脚本。-例如:如果文件中有多条命令,`hive-fmyscript.sql`会运行它们。-参考引用[^1].-额外提示:`-S`选项启用静默模式,隐藏信息性消息,便于脚本化。-结尾:希望解释对您有帮助。-§§相关问题§§:列出2-3个相关问题。相关问题:1.如何优化Hive命令的性能?2.Hive还有哪些常用命令行参数?3.Hive的静默模式如何使用?确认引用位置。</think> ### Hive 命令行参数解释:`-e` 和 `-f` Hive 是一个基于 Hadoop 的数据仓库工具,常用于处理大数据查询。其命令行界面支持多个参数,其中 `-e` 和 `-f` 是针对执行 SQL 命令的核心选项。下面我将一步步解释这两个参数的用法和作用,确保内容清晰可靠。 #### **1. `hive -e` 参数的用法** `hive -e` 允许您直接在命令行中执行一条 Hive SQL 查询或操作,无需进入交互式 Hive Shell。 - **语法**: `hive -e "Hive_SQL_Command"` 其中,`"Hive_SQL_Command"` 是您要运行的完整 SQL 语句,必须用双引号包裹。 - **作用**: 快速执行单次查询或操作,适用于自动化脚本或临时任务。返回查询结果到终端。 - **示例**: - 运行一个简单查询: ```bash hive -e "SELECT * FROM users WHERE age > 30;" ``` 这会返回表 `users` 中所有年龄大于 30 的记录。 - 结合静默模式(`-S`)抑制额外输出: ```bash hive -S -e "SELECT COUNT(*) FROM logs;" ``` 仅显示查询结果本身(如行数),隐藏日志信息[^1]. - **适用场景**: - 快速测试 SQL 语法或单条命令- 在 Shell 脚本中嵌入 Hive 查询以提高效率。 #### **2. `hive -f` 参数的作用** `hive -f` 用于执行一个包含多条 Hive SQL 命令的文件(脚本文件)。这对运行复杂或多步操作非常高效。 - **语法**: `hive -f filename` 其中,`filename` 是 SQL 脚本文件的路径(如 `.hql` 或 `.sql` 后缀)。 - **作用**: 读取文件中的 SQL 语句并依次执行。文件内容可以是多行查询(例如,创建表、插入数据、查询数据)。 - **示例**: - 创建一个 SQL 文件 `script.hql`: ```sql CREATE TABLE IF NOT EXISTS sales (id INT, amount DOUBLE); INSERT INTO sales VALUES (1, 100.0); SELECT AVG(amount) FROM sales; ``` - 执行该文件: ```bash hive -f script.hql ``` 这将顺序执行创建表、插入数据、计算平均值三个步骤。 - 结合静默模式(`-S`)优化输出: ```bash hive -S -f script.hql ``` 隐藏过程信息,只显示最终结果[^1]. - **适用场景**: - 批量运行复杂数据处理任务(如 ETL 流程)。 - 复用 SQL 脚本库,减少手动操作。 #### **额外说明** - **静默模式 (`-S`)**:常与 `-e` 或 `-f` 配合使用(例如 `hive -S -e ...`),抑制非查询相关的输出(如日志信息),适合自动化脚本[^1]. - **元数据库要求**:使用 Hive 时(包括 `beeline` 客户端),需确保 Hive 元数据库(如 MySQL)已正确设置,否则可能拒绝连接[^1]. - **其他参数**: - `hive --help`:查看所有可用参数帮助。 - `hive --set hive.var=value`:动态设置变量值。 希望以上解释能帮助您理解 Hive 命令行工具的核心用法。如果使用中的任何问题,可以进一步查询文档或结合日志排查问题[^1]. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值