Hive是Hadoop的一个模块。它是一个用于开发SQL类型脚本执行MapReduce操作的平台。
MapReduce是一种并行编程模型,用于在大型商用硬件集群上处理大量结构化、半结构化和非结构化数据。
Hive是一种方便与存储在HDFS(Hadoop文件系统)中的数据一起工作的方法。它是面向SQL的查询语言。基本上,Hive是用于Hadoop集群的SQL。它是在HDFS之上构建的开源数据仓库系统,为数据添加了结构。就像数据库一样,Hive具有创建数据库、创建表和使用查询语言处理数据的功能。用于Hive的查询语言称为Hive查询语言(HQL)。
使用与SQL相关联的Hive-QL,用户能够轻松进行数据分析。Hive引擎将这些查询编译成要在Hadoop上执行的Map-Reduce作业。
Hive 工作过程
使用Hive设置SET mapred.job.tracker=local;
大数据软件 | 默认端口 |
---|---|
Hadoop (HTTP) | 50070 |
YARN ResourceManager | 8088 |
MapReduce JobHistory Server | 19888 |
HDFS NameNode | 8020 |
Apache Pig | N/A |
Apache HBase Master | 16000 |
Apache Sqoop | N/A |
Apache Flume | N/A |
Apache Flink | 8081 |
Spark | 7077 |
Apache Pig,Apache Sqoop,和Apache Flume通常没有默认的通信端口,因为他们更多的是用作数据处理和集成工具,而不是服务。
联合是一组异构数据类型。可以使用create union创建实例。语法和示例如下:
UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>
{0:1}
{1:2.0}
{2:["three"," four" ]}
{3:{"a":5,"b":" five" }}
{2:["six", "seven" ]}
{3:{"a":8,"b":"eight" }}
{0:9}
Hive中的数组与Java中的使用方式相同。 语法:
ARRAY<数据类型>
Hive中的映射与Java中的映射类似。 语法:
MAP<原始类型,数据类型>
Hive中的结构体类似于使用带有注释的复杂数据。 语法:
STRUCT<列名:数据类型[COMMENT列注释],...>
Create database <DatabaseName>
from pyhive import hive# 建立连接conn = hive.Connection(host="localhost", port=10000, username="your_username")# 创建一个新的游标对象cur = conn.cursor()# 执行HiveQL命令cur.execute('CREATE DATABASE userdb')# 关闭连接conn.close()
Drop database <DatabaseName>
from pyhive import hive# 建立连接conn = hive.Connection(host="localhost", port=10000, username="your_username")# 创建一个新的游标对象cur = conn.cursor()# 执行HiveQL命令cur.execute('DROP DATABASE IF EXISTS userdb')# 关闭连接conn.close()
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [ROW FORMAT row_format] [STORED AS file_format]
表示例
Sr.No | Field Name | Data Type |
---|---|---|
1 | Eid | int |
2 | Name | String |
3 | Salary | Float |
4 | Designation | string |
注释, 行格式化字段,例如字段终止符,行终止符和存储文件类型。
COMMENT '员工详情'
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED IN TEXT FILE
hive 命令行示例
CREATE TABLE IF NOT EXISTS employee ( eid int, name String, salary String, destination String)COMMENT '员工详情'ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n'STORED AS TEXTFILE;
python 示例
from pyhive import hiveconn = hive.Connection(host="localhost", port=10000, username="hadoop", database="default")cursor = conn.cursor()# 创建 Hive 表create_table_query = """CREATE TABLE IF NOT EXISTS employee ( eid INT, name STRING, salary STRING, destination STRING) COMMENT '员工详情'ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n'STORED AS TEXTFILE;"""cursor.execute(create_table_query)print("Table employee created successfully.")cursor.close()conn.close()
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] LOCAL is identifier to specify the local path. It is optional. OVERWRITE is optional to overwrite the data in the table. PARTITION is optional.
sample.txt
1201 Gopal 45000 Technical manager 1202 Manisha 45000 Proof reader 1203 Masthanvali 40000 Technical writer1204 Kiran 40000 Hr Admin
hive> LOAD DATA LOCAL INPATH '/home/user/sample.txt'
ALTER TABLE name RENAME TO new_name ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...]) ALTER TABLE name DROP [COLUMN] column_name ALTER TABLE name CHANGE column_name new_name new_type ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])Rename To… Statement
hive> ALTER TABLE employee RENAME TO emp;
hive> ALTER TABLE employee CHANGE name ename String; hive> ALTER TABLE employee CHANGE salary salary Double;
这些函数用于集合。集合表示元素的分组,并根据函数名称中指定的返回类型返回单个元素或数组
返回类型 | 函数名 | 描述 |
---|---|---|
INT | size(Map<K.V>) | 映射类型中的数量 |
INT | size(Array<T>) | 数组类型中的数量 |
Array<K> | Map_keys(Map<K.V>) | 包含输入的键的数组 |
Array<V> | Map_values(Map<K.V>) | 包含输入的值的数组 |
Array<T> | Sort_array(Array<T>) | 对输入数组进行升序排序并返回。 |
视图是根据用户的要求生成的。您可以将任何结果数据保存为视图。我们可以在视图上执行所有的DML操作。
CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment], ...) ][COMMENT table_comment] AS SELECT...
假设员工表如下所示,字段为Id,Name,Salary,Designation和Dept。生成一个查询以检索薪水超过30000的员工详细信息。我们将结果存储在名为emp_30000的视图中。
hive> CREATE VIEW emp_30000 ASSELECT * FROM employeeWHERE salary>30000;
hive> DROP VIEW emp_30000;
索引就是对表的某一列进行指针的指向。创建索引意味着在表的某一列上创建一个指针。
CREATE INDEX index_name ON TABLE base_table_name (col_name, ...) AS 'index.handler.class.name' [WITH DEFERRED REBUILD] [IDXPROPERTIES (property_name=property_value, ...)] [IN TABLE index_table_name] [PARTITIONED BY (col_name, ...)] [ [ ROW FORMAT ...] STORED AS ... | STORED BY ... ][LOCATION hdfs_path] [TBLPROPERTIES (...)]
在 employee 表的 salary 列上创建一个名为 index_salary 的索引。
hive> CREATE INDEX inedx_salary ON TABLE employee(salary) AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';
DROP INDEX <index_name> ON <table_name>
hive> DROP INDEX index_salary ON employee;