HIVE学习系列笔记 一(精简版)

来源:互联网 发布:ted演讲 知乎 编辑:程序博客网 时间:2024/06/04 18:55
HIVE学习笔记精简版
学习资料:《Hive_user_guide》+ http://jingyan.baidu.com/article/a378c96092cf56b328283006.html + ...


Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 QL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。


Hive 的结构可以分为以下几部分: 
用户接口:包括 CLI, Client, WUI 
元数据存储。通常是存储在关系数据库如 mysql, derby 中 
解释器、编译器、优化器、执行器 

Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算 


Hadoop和Hive都是用UTF-8编码的

Hive 的可扩展性是和 Hadoop 的可扩展性是一致的


Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile) 


【数据加载】Hive 在加载数据的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。 
【数据改动】Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO ...  VALUES 添加数据,使用 UPDATE ... SET 修改数据。
【数据访问】Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些 Key 建立索引。Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。 另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架(MapReduce 本身具有较高的延迟)。 Hive 将元数据存储在 RDBMS 中,一般常用的有MYSQL和DERBY(Apache Derby非常小巧,核心部分derby.jar只有2M,所以既可以做为单独的数据库服务器使用,也可以内嵌在应用程序中使用)。RDBMS 是SQL 的基础,同样也是所有现代数据库系统的基础,比如MS SQL Server,MYSQL。Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:Table,External Table,Partition,Bucket。


1.每一个 Table 在 Hive 中都有一个相应的目录存储数据。
2.在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录。
3.Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件。
4.External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition


例如:
一个表 xiaojun,它在 HDFS 中的路径为:/ warehouse /xiaojun,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的 Table 数据(不包括 External Table)都保存在这个目录中。 
xiaojun 表中包含 dt 和 city 两个 Partition,则对应于 dt = 20100801, ciry = US 的 HDFS 子目录为:/ warehouse /xiaojun/dt=20100801/ctry=US;对应于 dt = 20100801, ciry = CA 的 HDFS 子目录为;/ warehouse /xiaojun/dt=20100801/ctry=CA 
将 user 列分散至 32 个 bucket,首先对 user 列的值计算 hash,对应 hash 值为 0 的 HDFS 目录为:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00000;hash 值为 20 的 HDFS 目录为:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00020 


【Table】 的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。 

【External Table 】只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在 LOCATION 后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。


启动HIVE的WEB的界面:sh $HIVE_HOME/bin/hive --service hwi
查看HDFS上的文件数据:hadoop fs -text /user/admin/daiqf/createspu_fp/input/cateinfo |head


HIVE 基本操作——create table

语法示例

1.创建带partition的表
create table if not exists mytable(
c1 string comment col_comment,
c2 bigint,
c3 double
id int,
)
partitioned by(col_name data_type [COMMENT col_comment])
row format delimited fields terminated by '\005' stored as textfile;  //如果文件数据是纯文本,使用 STORED AS TEXTFILE
row format delimited fields terminated by '\t' stored as sequence;//数据需要压缩使用 STORED AS SEQUENCE
row format delimited fields terminated by ',' stored as textfile;//指定了字段的分隔符为逗号,所以load数据的时候,load的文本也要为逗号,否则加载后为NULL。hive只支持单个字符的分隔符,hive默认的分隔符是\001。Alibaba数据库常用间隔符的读取:Ascii码5,Ascii码7等。在hive中Ascii码5用’\005’表示, Ascii码7用’\007’表示,依此类推。


【加载】load data local inpath '/home/zhangxin/hive/test_hive.txt'  overwrite into table test_part partition (dt='2012-03-05')
//local是本地文件,注意不是你电脑上的文件,是hadoop所在的本地文件
//如果是在hdfs里的文件,则不需要local。 overwrite into是覆盖表分区,仅仅是这个分区的数据内容,如果是追加,则不需要overwrite


2.创建external表
create external table if not exists mytable(
c1 string comment col_comment,
c2 bigint,
c3 double
id int,
)
row format delimited fields terminated by '\005' [stored as textfile] location '/home/..hdfs_path..'; 
//用逗号分隔的表,且无分区,  location后是外部表数据的存放路径


3.创建与已知表相同结构的表 Like:只复制表的结构,而不复制表的内容。
create [external] talbe if not exists mytable3
like existing_talbe_name
location hdfs_path


解读:
EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数 据会被一起删除,而外部表只删除元数据,不删除数据。如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。有分区的表可以在创建的时候使用 PARTITIONED BY 语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。而且,表和分区都可以对某个列进行 CLUSTERED BY 操作,将若干个列放入一个桶(bucket)中。也可以利用SORT BY 对数据进行排序。这样可以为特定应用提高性能。
LIKE 允许用户复制现有的表结构,但是不复制数据。
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe 。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表的具体的列的数据。
有分区的表可以在创建的时候使用 PARTITIONED BY 语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。而且,表和分区都可以对某个列进行 CLUSTERED BY 操作,将若干个列放入一个桶(bucket) 中。也可以利用SORT BY 对数据进行排序。这样可以为特定应用提高性能。
表名和列名不区分大小写,SerDe 和属性名区分大小写。表和列的注释是字符串。


hive建表语法

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]
   | STORED BY 'storage.handler.class.name' [ WITH SERDEPROPERTIES (...) ]  (Note:  only available starting with 


0.6.0)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]  (Note:  only available starting with 0.6.0)
  [AS select_statement]  (Note: this feature is only available starting with 0.5.0.)


CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
  LIKE existing_table_name
  [LOCATION hdfs_path]


data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type


primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | STRING


array_type
  : ARRAY < data_type >


map_type
  : MAP < primitive_type, data_type >


struct_type
  : STRUCT < col_name : data_type [COMMENT col_comment], ...>


row_format
  : DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, 


property_name=property_value, ...)]


file_format:
  : SEQUENCEFILE
  | TEXTFILE
  | RCFILE     (Note:  only available starting with 0.6.0)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname


目前在hive中常用的数据类型有:
   BIGINT – 主要用于状态,类别,数量的字段, 如status/option/type/quantity
   DOUBLE – 主要用于金额的字段, 如fee/price/bid
   STRING – 除上述之外的字段基本都使用String, 尤其是id和日期时间这样的字段
查看文件存储位置:Hadoop fs -ls
0 0