转载地址:https://github.com/DingHe/PerfAnalysis/blob/master/hive/HIVE.txt
beeline -u jdbc:hive2://
!connect jdbc:hive2://cloud011:10000
4、HIVEQL:Data Defination
create database if not exists finacials;
show databases;
show databases like 'f%';
create database finacials2 comment 'hold all finacials tables' location '/my/preferred/directory' ;
drop database finacials2;
describe database finacials2
hive.metastore.warehouse.dir 设置数据的默认路径
create database financials with dbproperties('creator'='XDH','date'='2016-09-13');
describe database extended financials;
set hive.cli.print.current.db=true; 设置当前的CLI显示数据库名称
drop database if exists financials cascade;
create database human_resource with dbproperties('creator'='XDH','date'='2016-09-13');
CREATE TABLE IF NOT EXISTS human_resource.employees (
name STRING COMMENT 'Employee name',
salary FLOAT COMMENT 'Employee salary',
subordinates ARRAY<STRING> COMMENT 'Names of subordinates',
deductions MAP<STRING, FLOAT> COMMENT 'Keys are deductions names, values are percentages',
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT> COMMENT 'Home address')
COMMENT 'Description of the table'
location '/user/hive/warehouse/human_resource.db/employees'
TBLPROPERTIES ('creator'='xdh', 'created_at'='2012-01-02 10:00:00') ; --TBLPROPERTIES要在LOCALTION的后面,否则会报错。
show tblproperties employees;
--拷贝一张已经存在的表的表模式而没有拷贝数据
create table if not exists mydb.employees2 like mydb.employees;
show tables in human_resource;
show tables like 'em*';
DESCRIBE EXTENDED employees;
DESCRIBE FORMATTED employees;
管理表:有时也称为内部表,默认存储在hive.metastore.warehouse.dir下,删除一个管理表时,HIVE也会删除这个表中的数据
外部表:因为表是外部的,所以HIVE并非认为其完全拥有这份数据,删除该表并不会删除掉这份数据,不过描述表的元信息会被删除掉
CREATE EXTERNAL TABLE IF NOT EXISTS financials.stocks (
exchange STRING , --exchange是HIVE的关键字,所以不能用于字段,书本《HIVE编程》这段代码是错误的
symbol STRING,
ymd STRING,
price_open FLOAT,
price_high FLOAT,
price_low FLOAT,
price_close FLOAT,
volume INT,
price_adj_close FLOAT )
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/data/stocks';
create external table if not exists financials.stocks(exchang string,symbol string,ymd string,price_open float,price_high float,price_low float,price_close float,volume int,price_adj_close float)
row format delimited fields terminated by ','
location '/data/stocks';
CREATE EXTERNAL TABLE IF NOT EXISTS financials.employees3
LIKE human_resource.employees
LOCATION '/path/to/data';
分区表、管理表:
CREATE TABLE human_resource.employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
PARTITIONED BY (country STRING, state STRING);
set hive.mapred.mode=strict/nostrict --设置hive为严格模式,如果对分区表进行查询而WHERE子句没有加分区过滤的话,将会禁止提交这个任务。
SHOW PARTITIONS employees
SHOW PARTITIONS employees PARTITION(country='US', state='AK');
SHOW PARTITIONS t_phone_attribution PARTITION(dt=201609131600);
describe formatted employees
load data local inpath '${env:HOME}/california-employees' into tables employees partition(country='US',state='CA')
外部分区表:
CREATE EXTERNAL TABLE IF NOT EXISTS log_messages (
hms INT,
severity STRING,
server STRING,
process_id INT,
message STRING)
PARTITIONED BY (year INT, month INT, day INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
ALTER TABLE log_messages ADD PARTITION(year = 2012, month = 1, day = 2)
LOCATION 'hdfs://master_server/data/log_messages/2012/01/02';
自定义表的存储格式:
CREATE TABLE employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
--TEXTFILE替换为其他HIVE所支持的内置文件格式,包括SEQUENCEFILE和RCFILE,这两种文件格式都是使用二进制编码和压缩来优化磁盘空间以及I/O带宽性能
CREATE TABLE kst
PARTITIONED BY (ds string)
ROW FORMAT SERDE 'com.linkedin.haivvreo.AvroSerDe'
WITH SERDEPROPERTIES ('schema.url'='http://schema_provider/kst.avsc') --HIVE不知道SERDEPROPERTIES指定的属性信息,需要SERDE自己去解析
STORED AS
INPUTFORMAT 'com.linkedin.haivvreo.AvroContainerInputFormat' --要同时指定INPUTFORMAT和OUTPUTFORMAT
OUTPUTFORMAT 'com.linkedin.haivvreo.AvroContainerOutputFormat';
CREATE EXTERNAL TABLE IF NOT EXISTS stocks (
exchang STRING,
symbol STRING,
ymd STRING,
price_open FLOAT,
price_high FLOAT,
price_low FLOAT,
price_close FLOAT,
volume INT,
price_adj_close FLOAT)
CLUSTERED BY (exchang, symbol)
SORTED BY (ymd ASC)
INTO 96 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/data/stocks';
DROP TABLE IF EXISTS employees;
fs.trash.internal --设置hdfs回收站保留数据的时间
ALTER TABLE log_messages RENAME TO logmsgs;
ALTER TABLE log_messages ADD IF NOT EXISTS
PARTITION (year = 2011, month = 1, day = 1) LOCATION '/logs/2011/01/01'
PARTITION (year = 2011, month = 1, day = 2) LOCATION '/logs/2011/01/02'
PARTITION (year = 2011, month = 1, day = 3) LOCATION '/logs/2011/01/03';
ALTER TABLE log_messages PARTITION(year = 2011, month = 12, day = 2)
SET LOCATION 's3n://ourbucket/logs/2011/01/02';
ALTER TABLE log_messages DROP IF EXISTS PARTITION(year = 2011, month = 12, day = 2);
ALTER TABLE log_messages
CHANGE COLUMN hms hours_minutes_seconds INT
COMMENT 'The hours, minutes, and seconds part of the timestamp'
AFTER severity;
ALTER TABLE log_messages ADD COLUMNS (
app_name STRING COMMENT 'Application name',
session_id22 float COMMENT 'The current session id');
ALTER TABLE log_messages REPLACE COLUMNS (
hours_mins_secs INT COMMENT 'hour, minute, seconds from timestamp',
severity STRING COMMENT 'The message severity',
message STRING COMMENT 'The rest of the message');
ALTER TABLE log_messages SET TBLPROPERTIES ('notes'='The process id is no longer captured');
ALTER TABLE table_using_JSON_storage
SET SERDE 'com.example.JSONSerDe'
WITH SERDEPROPERTIES (
'prop1' = 'value1',
'prop2' = 'value2');
--将分区内的文件打成一个HADOOP压缩包(HAR)文件,可以降低文件系统中文件数以及减轻NameNode的压力
alter table log_messages archive/unarchive partition(year=2012,month=1,day=1)
--下面的语句可以防止分区被删除和查询
ALTER TABLE log_messages
PARTITION(year = 2012, month = 1, day = 1) ENABLE NO_DROP;
ALTER TABLE log_messages
PARTITION(year = 2012, month = 1, day = 1) ENABLE OFFLINE;
5、HIVEQL:Data Manipulation
LOAD DATA LOCAL INPATH '${env:HOME}/california-employees'
OVERWRITE INTO TABLE employees
PARTITION (country = 'US', state = 'CA');
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'OR')
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'OR';
FROM staged_employees se
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'OR')
SELECT * WHERE se.cnty = 'US' AND se.st = 'OR'
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'CA')
SELECT * WHERE se.cnty = 'US' AND se.st = 'CA'
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'IL')
SELECT * WHERE se.cnty = 'US' AND se.st = 'IL';
动态分区插入:
--HIVE根据SELECT语句中最后2列来确定分区字段country和state的值
INSERT OVERWRITE TABLE employees
PARTITION (country, state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state)
SELECT ..., se.cnty, se.st
FROM staged_employees se
WHERE se.cnty = 'US';
hive.exec.dynamic.partition false 设置成true,表示开启动态分区功能
hive.exec.dynamic.partition.mode strict 设置成nonstrict,表示所有分区是动态的
dynamically.hive.exec.max.dynamic.partitions.pernode 100 每个MAPPER或者REDUCER可以创建的最大动态分区个数
hive.exec.max.dynamic.partitions +1000 一个动态分区创建语句可以创建的最大动态分区个数
hive.exec.max.created.files 100000 全局可以创建的最大文件个数
单个语句创建表并加载数据:
CREATE TABLE ca_employees
AS SELECT name, salary, address
FROM employees se
WHERE se.state = 'CA';
导出数据:
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';
FROM staged_employees se
INSERT OVERWRITE DIRECTORY '/tmp/or_employees'
SELECT * WHERE se.cty = 'US' and se.st = 'OR'
INSERT OVERWRITE DIRECTORY '/tmp/ca_employees'
SELECT * WHERE se.cty = 'US' and se.st = 'CA'
INSERT OVERWRITE DIRECTORY '/tmp/il_employees'
SELECT * WHERE se.cty = 'US' and se.st = 'IL';
6、HiveQL:Queries
CREATE TABLE employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
PARTITIONED BY (country STRING, state STRING);
--提取ARRAY数组的元素
SELECT name, subordinates[0] FROM employees;
--提取MAP集合元素的方法
SELECT name, deductions["State Taxes"] FROM employees;
--提取STRUCT结构的元素
SELECT name, address.city FROM employees;
--使用正则表达式来选择列
select symbol,`price.*` from stocks; 选择symbol列和所有列名为price作为前缀的列
set hive.map.aggr=true; --这个设置会触发在map阶段进行“顶级”聚合过程,可以提高聚合的性能,不过这个设置需要更多的内存
--与聚合函数“相反的”一类函数就是所谓的表生成函数,其可以将单列拓展成多列或者多行
SELECT explode(subordinates) AS sub FROM employees;
--如果设置了该属性为true的话,HIVE还会尝试使用本地模式进行其他的操作
set hive.exec.mode.local.auto=true;
--大多数情况下,HIVE会对每个join连接对象启动一个MapReduce任务,本例中,会首先启动一个MapReduce JOB对表a和表b进行连接操作,
--然后会再启动一个MapReduce job将第一个Job的输出和表c进行连接操作
--HIVE总是从左到右的顺序执行
--HIVE同时假定查询中最后一个表是最大的表
SELECT a.ymd, a.price_close, b.price_close , c.price_close
FROM stocks a JOIN stocks b ON a.ymd = b.ymd
JOIN stocks c ON a.ymd = c.ymd
WHERE a.symbol = 'AAPL' AND b.symbol = 'IBM' AND c.symbol = 'GE';
--这样的语法告诉HIVE,stocks是最大的表,也就是驱动表
SELECT /*+ STREAMTABLE(s) */ s.ymd, s.symbol, s.price_close, d.dividend
FROM stocks s JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol
WHERE s.symbol = 'AAPL';
->left semi-join
左半开连接会返回左边表的记录,前提是记录对于右边表满足on语句中的判定条件。
对于常见的内连接(INNER JOIN)来说,这是一个特殊的优化了的情况。大多数的SQL方言
通过IN或者EXISTS结构来处理这种情况。
例如HIVE不支持如下的语法:
SELECT s.ymd, s.symbol, s.price_close FROM stocks s
WHERE s.ymd, s.symbol IN
(SELECT d.ymd, d.symbol FROM dividends d);
通过 left semi-join实现如下:
SELECT s.ymd, s.symbol, s.price_close
FROM stocks s LEFT SEMI JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol;
注意:SELECT和WHERE语句不能引用到右边表中的字段,目前不支持RIGHT SEMI-JOIN
hive.mapred.mode=strict; --HIVE会阻止用户执行笛卡尔积查询
->map-side JOIN
如果所有的表中只有一张表是小表,那么可以在最大的表通过Mapper的时候将小表完全放在内存中。
HIVE可以在map端执行连接过程(称为map-side join)
HIVE0.7的语法:
SELECT /*+ MAPJOIN(d) */ s.ymd, s.symbol, s.price_close, d.dividend
FROM stocks s JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol
WHERE s.symbol = 'AAPL';
HIVE0.7以后:
set hive.auto.convert.JOIN=true ;--打开这个选项HIVE会在必要的时候启动这个优化
set hive.mapjoin.smalltable.filesize=2500000; --设置使用map-side join小表的大小
->ORDER BY语句会对查询结果集执行一个全局排序,也就是说会有一个所有的数据都通过一个reducer进行
处理的过程,对于大数据,这个过程可能消耗太过漫长的时间来执行
->sort by语句进行局部排序,可以保证每个reducer的输出是局部排序的,但是不保证全局排序
->distribute by 语句控制map的输出在reducer中是如何分布的,同时HIVE要求distribute by语句要写在sort by语句之前
SELECT s.ymd, s.symbol, s.price_close
FROM stocks s
DISTRIBUTE BY s.symbol
SORT BY s.symbol ASC, s.ymd ASC;
->cluster by ,如果distribute by语句和sort by语句的列相同,那么可以使用cluster by 语句简写
上面的语句去掉sort by语句后的s.ymd可以简写如下
SELECT s.ymd, s.symbol, s.price_close
FROM stocks s
CLUSTER BY s.symbol;
->cast 类型转换
SELECT name, salary FROM employees
WHERE cast(salary AS FLOAT) < 100000.0;
->抽样查询
SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON rand()) s;
百分比抽样
SELECT * FROM numbersflat TABLESAMPLE(0.1 PERCENT) s;
CREATE TABLE numbers_bucketed (number int) CLUSTERED BY (number) INTO 3 BUCKETS;
set hive.enforce.bucketing=true;
9、Schema Design
->按天划分的表:使用分区表
->HDFSY用于存储数百万的大文件,而非数十亿的小文件,过多分区可能导致的一个问题就是会创建大量的非必须的HADOOP文件和文件夹
对于小文件,每个文件都对应一个task
->如果没有明显的分区字段,可以进行分桶,则字段会根据用户指定的值进行哈希分发到桶中,同一个字段值的记录通常会存储到同一个桶内,假设用户数要比桶数多得多,那么每个桶内就会包含多个用户的记录
hive.enforce.bucketing=true --强制Hive为目标表的分桶初始化过程设置一个正确的reducer个数
->压缩和解压缩都会消耗CPU资源,但是MapReduce任务是IO密集型的,因此CPU开销通常不是问题。
10、Tuning
explain select * from t_area_ci;
一个stage可以是一个MapReduce任务,也可以是一个抽样阶段或者一个合并阶段,还可以是一个limit阶段,以及HIVE需要的其他某个任务的一个阶段
explain extended select * from t_area_ci;
hive.limit.optimize.enable --如果使用limit语句,并设置这个参数为true,则对源数据进行抽样,不需要执行整个语句再返回部分结果
hive.limit.row.max.size
hive.limit.optimize.limit.file
join优化:将最大的表放置在join语句的最右边或者直接使用/*streamtable(table_name)*/语句指出
本地模式: hive.exec.mode.local.auto=true,HIVE在适当的时候自动启动这个优化
并行执行: hive.exec.parallel=true ,开启互相不依赖的阶段可以并行执行
严格模式: hive.mapred.mode=strict ,禁止3种类型的查询,其一:对于分区表,除非WHERE语句含有分区字段过滤,其二,对于使用ORDER BY的语句必须使用LIMIT语句,其三,限制笛卡尔积的查询
调整MAPPER和REDUCER个数:
hive.exec.reducers.bytes.per.reducer ,默认值为1GB
mapred.reduce.tasks ,可以设置需要的reducer的个数,默认是3个
hive.exec.reducers.max ,控制某个Job允许使用的最大reducers的个数
如何查询集群总共的map和reduce的个数???
mapred.job.reuse.jvm.num.tasks ,设置JVM重复使用的次数,缺陷是JVM重用将会一直占用使用的task插槽,直到任务完成才能释放。
dfs.datanode.max.xcievers ,控制DataNode上一次可以打开的文件个数
推测执行:目标是通过加快获取单个task的结果以及进行侦测将执行慢的TaskTracker加入黑名单的方式来提高整体的任务执行效率
mapred.map.tasks.speculative.execution=true
mapred.reduce.tasks.speculative.execution=true
11、Other File Formats and Compression
--查看设置或者查看编解码器
hive -e "set io.compression.codecs"
存储压缩:
--所有最新的Hadoop版本都内置支持GZIP和BZip2(压缩率最高)压缩方案,LZO和Snappy压缩率相对小,但是速度更快
--Gzip和Snappy压缩的文件不可分割
--当用户没有使用默认的文本文件格式时,需要告诉HIVE使用的INPUTFORMAT和OUTPUTFORMAT是什么,记录是如何
--分割成字段的,HIVE使用SerDe作为对输入记录进行分割以及写记录的“模版”
开启中间压缩:
hive.exec.compress.intermediate ,默认值是false
对于其他的hadoop job来说控制中间数据压缩的属性是 mapred.compress.output
默认的压缩编解码器是DefaultCodec,可以通过属性 mapred.map.output.compression.codec 修改,SnappyCodec是一个比较好的中间文件压缩编解码器
最终输出结果压缩:
hive.exec.compress.output 控制这个功能,默认值是false
mapred.output.compression.codec 可以执行压缩的编解码器
对于其他hadoop任务,开启最终输出结果压缩功能是 mapred.output.compress
使用Sequence File存储格式:
create table a_sequence_file_table stored as sequencefile;
sequence file 提供3种压缩方式: NONE、RECORD和BLOCK,默认是RECORD级别,不过BLOCK级别的压缩性能最好而且是可以分割的
mapred.output.compression.type ,指定压缩的级别,比如BLOCK
实践:
hive> SELECT * FROM a;
4 5
3 2
hive> DESCRIBE a;
a int
b int
set hive.exec.compress.intermediate=true;
CREATE TABLE intermediate_comp_on ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' AS SELECT * FROM a;
--设置中间压缩的编解码器
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.GZipCodec;
set hive.exec.compress.intermediate=true;
CREATE TABLE intermediate_comp_on_gz ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' AS SELECT * FROM a;
--最终结果压缩
set hive.exec.compress.output=true;
CREATE TABLE final_comp_on ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' AS SELECT * FROM a;
这样情况下表final_comp_on还是可以查询,实际上是使用了hadoop的TextInputFormat进行的处理,TextInputFormat可以识别
文件后缀名为.deflate或者.gz的压缩文件。
--设置最终结果压缩的编解码器
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
CREATE TABLE final_comp_on_gz ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' AS SELECT * FROM a;
上面操作产生的结果文件是不可分割的,解决方法是使用sequencefile文件格式
set mapred.output.compression.type=BLOCK;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
CREATE TABLE final_comp_on_gz_seq ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS SEQUENCEFILE AS SELECT * FROM t_area_ci;
dfs -text /user/hive/warehouse/final_comp_on_gz_seq/000000_0;
因为sequence file中嵌入了元数据信息以及hive元数据信息,Hive无需任何特别的设置就可以查询这张表了。
存档分区:
HADOOP中有一种存档格式名为HAR,也就是Hadoop Archive简写。
14、Streaming
streaming的执行效率通常比对应的编写UDF或者改写InputFormat对象的方式要低
恒等变换:
SELECT TRANSFORM (ci, area_id) USING '/bin/cat' AS newA, newB FROM t_area_ci;
改变类型:
SELECT TRANSFORM (ci, area_id) USING '/bin/cat' AS (newA INT, newB DOUBLE) FROM t_area_ci;
投影变换:
SELECT TRANSFORM (ci, area_id) USING '/bin/cut -f1,2' AS newA,newB FROM t_area_ci;
操作转换:
SELECT TRANSFORM (ci, area_id) USING '/bin/sed s/a/AAAA/' AS newA,newB FROM t_area_ci;
使用分布式缓存:
--ctof.sh内容
while read LINE
do
res=$(echo "scale=2;((9/5) * $LINE) + 32" | bc)
echo $res
done
hive> ADD FILE ${env:HOME}/prog_hive/ctof.sh;
hive> SELECT TRANSFORM(col1) USING 'ctof.sh' AS convert FROM a;
SELECT TRANSFORM (ci) USING 'ctof.sh' AS newA,newB FROM t_area_ci;
15、Customizing Hive File and Record Formats
语法stored as sequencefile的替代方式是指定inputformat为 org.apache.hadoop.mapred.SequenceFileInputFormat,
并且指定outputformat为 org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
create table text (x int) ;
describe extended text;
CREATE TABLE seq (x int) STORED AS SEQUENCEFILE;
DESCRIBE EXTENDED seq;
当从HIVE表中读取数据时,HIVE会使用INPUTFORMAT;而当向表中写入数据时,会使用OUTPUTFORMAT
文件格式:
1、sequence file 是含有键-值对的二进制文件,也是HIVE和其他hadoop工具共享文件可以接受的选择。
2、RCfile ,如果表有成百上千个字段,而查询只需要使用其中一小部分字段,这是扫描所有的行而过滤掉大部分的数据显然是个浪费。
而数据是按列存储的话,只需要对需要的列进行扫描即可。
create table columnTable (key string , value string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat';
FROM t_area_ci a INSERT OVERWRITE TABLE columnTable SELECT a.ci, a.area_id;
bin/hive --service rcfilecat /user/hive/warehouse/columntable/000000_0
记录格式: SerDe
一个SerDe包含了将一条记录的非结构化字节转化成HIVE可以使用的一条记录的过程。
CREATE TABLE serde_regex(
host STRING,
identity STRING,
user STRING,
time STRING,
request STRING,
status STRING,
size STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\])
([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\")
([^ \"]*|\"[^\"]*\"))?",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
STORED AS TEXTFILE;
CREATE EXTERNAL TABLE messages (
msg_id BIGINT,
tstamp STRING,
text STRING,
user_id BIGINT,
user_name STRING
)
ROW FORMAT SERDE "org.apache.hadoop.hive.contrib.serde2.JsonSerde"
WITH SERDEPROPERTIES (
"msg_id"="$.id",
"tstamp"="$.created_at",
"text"="$.text",
"user_id"="$.user.id",
"user_name"="$.user.name"
)
LOCATION '/data/messages';
16、 Hive Thrift Service
HIVESERVER:
CLI是胖客户端,其需要本地具有所有的HIVE组件,包括配置,同时还需要一个HADOOP客户端及其配置。其可以作为HDFS客户端、MapReduce客户端以及JDBC客户端(用于访问元数据库)进行使用。
/bin/hive --service hiveserver &
hive.start.cleanup.scratchdir ,默认值是false,当值为true的话,每次重启HiveServer服务时清理掉临时目录
ThriftMetastore:
HIVE会话直接连接到一个JDBC数据库,也可选择连接ThriftMetastore并且和JDBCMetastore进行通讯,
对于那些非JAVA客户端而需要获取元数据存储信息时才会用到ThriftMetastore。
bin/hive --service metastore & --启动ThriftMetastore
客户端配置:
hive.metastore.local=false
hive.metastore.uris=thrift://metastore_server:9083
17、 storage Handlers and Nosql
存储处理程序是一个结合InputFormat、OutputFormat、SerDe和Hive需要使用的特定的代码,来将
外部实体作为标准的Hive表来处理的整体。
这样无论是以文本文件的方式存储在Hadoop中,还是以列族的房his存储在如Hbase、Cassandra和DynamoDB
这样的NoSql数据库中,用户都可以无缝第直接执行查询。
HiveStorageHandler:是HIVE用于连接Hbase、Cassandra等类似的NoSql存储的主要接口。
检查接口发现需要一个定制的inputformat、outputformat和serde。
具体实现方式请在网上差资料