2

我们可以使用带有此命令的hbase shell来计算所有行数:count 'table_name', INTERVAL=> 1或者只是简单的count 'table_name

但是如何使用Scala 编程来做到这一点?

4

2 回答 2

1

虽然我已经完成了 Hbase 的 java 客户端,但我研究并发现了以下.. Java 方式代码片段:

您可以使用KeyOnlyFilter () 仅获取行的键。然后像下面这样循环..

   for (Result rs = scanner.next(); rs != null; rs = scanner.next()) {
        number++;
    }

像上面一样,您可以使用下面的 scala hbase 示例..

请查看 Java API。适应scala应该相对容易。下面的示例显示了适用于 scala 的示例 Java 代码的一部分:

import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.{HBaseAdmin,HTable,Put,Get}
import org.apache.hadoop.hbase.util.Bytes


val conf = new HBaseConfiguration()
val admin = new HBaseAdmin(conf)

// list the tables
val listtables=admin.listTables() 
listtables.foreach(println)

// let's insert some data in 'mytable' and get the row

val table = new HTable(conf, "mytable")

val theput= new Put(Bytes.toBytes("rowkey1"))

theput.add(Bytes.toBytes("ids"),Bytes.toBytes("id1"),Bytes.toBytes("one"))
table.put(theput)

val theget= new Get(Bytes.toBytes("rowkey1"))
val result=table.get(theget)
val value=result.value()
println(Bytes.toString(value))

但是,作为附加信息(以及比 java 或 scala 最好的方法),请参见下文

RowCounter是一个 mapreduce 作业,用于计算表的所有行。这是一个很好的实用程序,可用作完整性检查,以确保HBase在存在元数据不一致问题时可以读取表的所有块。它将在单个进程中运行所有 mapreduce,但如果您有一个 MapReduce 集群可供它利用,它将运行得更快。

$ hbase org.apache.hadoop.hbase.mapreduce.RowCounter <tablename>

Usage: RowCounter [options] 
    <tablename> [          
        --starttime=[start] 
        --endtime=[end] 
        [--range=[startKey],[endKey]] 
        [<column1> <column2>...]
    ]
于 2016-07-29T11:41:45.217 回答
0

用java客户端,可以扫描所有表,RowKeyOnlyFilter有效。通过这种方式,您只将行键传输到您的客户端代码,而不是数据,因此它会更快。这也是 count 'tablename' 在 shell 中所做的。

于 2016-07-29T15:52:49.823 回答