Hive之——存储处理程序和NoSQL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l1028386804/article/details/88647823

转载请注明出处:https://blog.csdn.net/l1028386804/article/details/88647823

HBase

下面的例子展示了如何使用HiveQL创建一个指向HBase表的Hive表:

create table hbase_stocks(key int, name string, price float) 
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping"=":key,stock:val")
tblproperties("hbase.table.name"="stocks");

如果想创建一个指向一个已经存在的HBase表的Hive表的话,那么就必须使用create external table 这个HiveQL语句:

create external table hbase_stocks(key int, name string, price float)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ("hbase.columns.mapping"="cfl:val")
tblproperties("hbase.table.name"="stocks")

对于一个指定的Hive查询,不需要扫描整个HBase表,通过过滤下推裁剪将会得到返回给Hive的行数据.
可以进行微词下推的类型如下:

key < 20
key = 20
key < 20, 而且 可以 key > 10

其他的复杂类型的微词都会忽略掉而不会启用下推功能。

比如下面的例子,首先创建了一个简单的表,然后对这个表进行的查询语句将会使用到过滤条件下推的功能。需要注意的是下推的总是HBase键,而非列组中的列值。

create table hbase_pushdown(key int, value string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping"=":key,cf:string");

select * from hbase_pushdown where key = 90;

如下这个查询不会查询下推,因为其过滤条件中包含有OR操作符。

select * from hbase_pushdown where key >= '80' or key >= '100';

和HBase结合使用的Hive支持HBase表和HBase表的连接操作,也支持HBase表和非HBase表的连接操作。
默认情况下,下推优化是开启的,不过可以通过如下命令将此功能关闭:

set hive.optimize.ppd.storage=false;

当将Hive中的数据导入到HBase时,需要注意,HBase要求键是排重后唯一的,而Hive并无此要求。

Hive和HBase列映射需要注意如下问题:

  • 没有访问HBase行时间戳的方式,只会返回最新版本的行
  • HBase的键必须进行显示定义

Cassandra

一个Cassandra列足和一个Hive表映射起来,同样的 Cassandra 列名和Hive列名直接映射起来。

静态列映射

当指定了Cassandra中的哪些列期望和Hive列进行映射时使用静态列存储非常有用。下面的例子中,首先创建了一个Hive外部表,和一个已存在的Cassandra键空间及列族相映射:

create external table weblog(useragent string, ipaddress string, timestamp string)
stored by 'org.apache.hadoop.hive.cassandra.CassandraStorageHandler'
with serdeproperties(
"cassandra.columns.mapping"=":key,user_agent, ip_address, time_stamp")
tblproperties(
"cassandra.range.size"="200",
"cassandra.slice.predicate.size"="150");

为动态列转置列映射

这种使用场景是某个指定列组没有固定的、已命名的列,而是由列的行键代表某片数据。常用于时间序列数据,其中列名代表时间,而列值代表那个时间的值。如果列名是已知的话,或者用户需要检索所有值时,这也是很有用的。

create external table weblog(useragent string, ipaddress string, timestamp string) 
stored by 'org.apache.hadoop.hive.cassandra.CassandraStorageHandler'
with serdeproperties(
"cassandra.columns.mapping"=":key,:column,:value");

Cassandra Serde Properties

可以在with serdeproperties语句中定义:
Cassandra Serde存储控制器属性

名称								描述
cassandra.columns.mapping			将Hive的列和Cassandra的列映射起来
cassandra.cf.name				Cassandra中的列族名
cassandra.host					要连接的 Cassandra 节点IP
cassandra.port					Cassandra RPC端口,默认是9160
cassandra.partitioner				分区器,默认是RandomPartitioner

可以在属性tblproperties语句中进行定义
Cassandra表属性

属性名							描述
cassandra.ks.name				Cassandra键空间名称
cassandra.ks.repfactor				Cassandra冗余因子,默认是1
cassandra.ks.strategy				冗余策略,默认是SimpleStrategy
cassandra.input.split.size			MapReduce划分大小,默认是64*1024
cassandra.range.size				MapReduce批处理范围大小,默认是1000
cassandra.slice.predicate.size		        MapReduce片推测大小,默认是1000

DynamoDB

DynamoDB属于键-值数据库中的一种。在 DynamoDB 中,表就是一组元素的集合,而且其中必须要有一个主键,一个元素包含有一个键和任意数量的属性值。不同元素可以具有不同的属性集。

用户可以通过Hive查询Dynamic中的表,而且可以迁移出数据或者导入数据到S3中。下面是一个关于股票Hive表的例子,这个表的底层其实是一张 DynamoDB 表:

create external table dynamo_stocks(
key int,
symbol string,
ymd string,
price float)
stored by 
'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
tblproperties(
"dynamodb.table.name"="Stocks",
"dynamodb.column.mapping"="key:Key, symbol:Symbol, ymd: YMD, price_close: Close");

猜你喜欢

转载自blog.csdn.net/l1028386804/article/details/88647823