转载请注明出处: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");