hbase中表的数据时怎么存储的

HBASE中的表示按column family来存储的

建立一个有3个column family的表

create 't1', {NAME => 'f1', VERSIONS => 1}, {NAME => 'f2', VERSIONS => 1}, {NAME => 'f3', VERSIONS => 1}

定义表的时候只需要指定column family的名字,列名在put的时候动态指定
插入数据
下面插入没有指定column的名字
put 't1', 'r1', 'f1', 'v1'
put 't1', 'r2', 'f2', 'v2'
put 't1', 'r3', 'f3', 'v3'

下面插入指定column的名字
put 't1', 'r4', 'f1:c1', 'v1'
put 't1', 'r5', 'f2:c2', 'v2'
put 't1', 'r6', 'f3:c3', 'v3'

hbase(main):245:0> scan 't1'
ROW COLUMN+CELL
r1 column=f1:, timestamp=1335407967324, value=v1
r2 column=f2:, timestamp=1335408004559, value=v2
r4 column=f1:c1, timestamp=1335408640777, value=v1
r5 column=f2:c1, timestamp=1335408640822, value=v2
r6 column=f1:c6, timestamp=1335412392258, value=v3
r6 column=f2:c1, timestamp=1335412384739, value=v3
r6 column=f2:c2, timestamp=1335412374797, value=v3

插入多列的数据

put 't1', 'r7', 'f1:c4', 'v9'
put 't1', 'r7', 'f2:c3', 'v9'
put 't1', 'r7', 'f3:c2', 'v9'

手工把memstore写到Hfile中

flush 't1'

删除所有CF3的数据

deleteall 't1','r7'

flush 't1'

每次flash都会建一个新的hfile

$ ../bin/hadoop dfs -lsr /hbase/t1

数据时直接存到CF目录下的,每个CF目录下有3到4个Hfile

f1
f1/098a7a13fa53415b8ff7c73d4d69c869
f1/321c6211383f48dd91e058179486587e
f1/9722a9be0d604116882115153e2e86b3
f2
f2/43561825dbde4900af4fb388040c24dd
f2/93a20c69fdec43e8beeed31da8f87b8d
f2/b2b126443bbe4b6892fef3406d6f9597
f3
f3/98352b1b34e242ecac72f5efa8f66963
f3/e76ed1b564784799affa59fea349e00d
f3/f9448a9a381942e7b785e0983a66f006
f3/fca4c36e48934f2f9aaf1a585
c237d44

f3都数据虽然都被删除了,由于没有合并文件都存在

手工合并hfile

hbase(main):244:0> compact 't1'

0 row(s) in 0.0550 seconds


$ ../bin/hadoop dfs -lsr /hbase/t1
f1
f1/00c05ba881a14ca0bdea55ab509c2327
f2
f2/95fbe85769d64fc4b291cabe73b1ddb2

/f3

f1和f2下就只有一个hfile,f3下面没有hfile因为数据都被删除了


一次只能put一个column
一次只能delete一个column
删除整行,用deleteall
deleteall 't1', 'r1'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache Spark可以与HBase进行集成,以便将数据存储HBase中。HBase是一个分布式的、可伸缩的、NoSQL数据库,适合存储大量结构化数据。Spark可以使用HBase作为数据源或数据目的地,以便从HBase中读取数据或将数据写入HBase。 要将数据存储HBase中,首先需要将数据转换为HBase支持的格式。可以使用HBase API将数据写入HBase表中,或者使用Spark的HBase Connector将数据写入HBase。具体实现方法取决于您的需求和环境。 下面是一个示例代码片段,演示如何使用Spark将数据写入HBase: ```scala import org.apache.hadoop.hbase.{HBaseConfiguration, TableName} import org.apache.hadoop.hbase.client.{Connection, ConnectionFactory, Put} import org.apache.hadoop.hbase.util.Bytes import org.apache.spark.sql.functions._ import org.apache.spark.sql.{DataFrame, SparkSession} object SparkHBaseWriter { def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .appName("Spark HBase Writer") .master("local[*]") .getOrCreate() // 读取数据 val df = spark.read.format("csv").option("header", "true").load("path/to/data.csv") // 将数据转换为HBase格式 val hbaseTable = "mytable" val hbaseColumnFamily = "mycolumnfamily" val hbaseRowKeyColumn = "id" val hbaseColumns = List("col1", "col2", "col3") val hbaseData = df.select( col(hbaseRowKeyColumn).cast("string"), col(hbaseColumns(0)).cast("string"), col(hbaseColumns(1)).cast("string"), col(hbaseColumns(2)).cast("string") ).rdd.map(row => { val put = new Put(Bytes.toBytes(row.getString(0))) put.addColumn(Bytes.toBytes(hbaseColumnFamily), Bytes.toBytes(hbaseColumns(0)), Bytes.toBytes(row.getString(1))) put.addColumn(Bytes.toBytes(hbaseColumnFamily), Bytes.toBytes(hbaseColumns(1)), Bytes.toBytes(row.getString(2))) put.addColumn(Bytes.toBytes(hbaseColumnFamily), Bytes.toBytes(hbaseColumns(2)), Bytes.toBytes(row.getString(3))) (new ImmutableBytesWritable(), put) }) // 连接HBase并将数据写入表中 val hbaseConf = HBaseConfiguration.create() hbaseConf.set("hbase.zookeeper.quorum", "localhost") hbaseConf.set("hbase.zookeeper.property.clientPort", "2181") val connection: Connection = ConnectionFactory.createConnection(hbaseConf) val table = connection.getTable(TableName.valueOf(hbaseTable)) hbaseData.saveAsNewAPIHadoopDataset(table.getConfiguration) connection.close() } } ``` 在上面的代码片段中,我们首先从CSV文件中读取数据,然后将数据转换为HBase格式。接下来,我们使用HBase Connector连接到HBase,并将数据写入HBase表中。 请注意,上面的代码片段仅用于演示目的。在实际应用程序中,您需要根据您的需求进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值