【问题标题】:How to count all rows on Hbase table using Scala如何使用 Scala 计算 Hbase 表上的所有行
【发布时间】:2016-07-22 10:15:51
【问题描述】:

我们可以计算所有行,使用 hbase shell 和这个命令:count 'table_name', INTERVAL=> 1 或简单的count 'table_name

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

【问题讨论】:

  • 可以使用java客户端
  • 这里有一个使用Java编程实现的例子,github.com/sel-fish/hbase-experiments/blob/master/src/test/java/…,也许它会给你一些提示
  • 我认为答案很大程度上取决于您使用的客户端。有标准的 Java 客户端、Scalding 和 HPaste,专门用于使用来自 Scala 的 HBase。然后是 asynchbase ......为了给你一个答案,一些关于你正在使用的客户端的信息会很有用。
  • 请看我的回答我给出了在scala中做的指针。虽然,这是一种非常罕见的做法!
  • @RamPrasadG 我今天会尝试并告诉你我的实验的消息......谢谢

标签: scala hadoop hbase nosql-aggregation nosql


【解决方案1】:

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

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

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

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

Please look at the Java API. Adaptation to scala should be relatively easy. The example below shows part of the sample Java code adapted to scala:

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>...]
    ]

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-28
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2019-03-04
      相关资源
      最近更新 更多