如何从Hbase加载最新的100行到Spark

时间:2015-12-23 16:23:42

标签: java apache-spark hbase

我正在使用Spark将Hbase数据加载到JavaPairRDD<>中。现在,我想知道我是否可以将最新的100行加载到Spark而不是来自Hbase的所有行。 1)我尝试了scan.setCaching(100),但它仍然返回了所有行。是否出于限制从Hbase加载的行的目的? 2)我怎样才能确定它是最新的100行

有什么想法吗?非常感谢。

    Scan scan = new Scan();
    scan.setFilter(A list of filters);
    scan.setCaching(100);

    ClientProtos.Scan proto = ProtobufUtil.toScan(scan);
    String scanStr = Base64.encodeBytes(proto.toByteArray());

    hbaseConfig.set(TableInputFormat.INPUT_TABLE, tableName);
    hbaseConfig.set(TableInputFormat.SCAN,scanStr);

    JavaPairRDD<ImmutableBytesWritable, Result> hBaseRDD = 
            javaSparkContext.newAPIHadoopRDD(hbaseConfig, TableInputFormat.class, ImmutableBytesWritable.class, Result.class).cache();

1 个答案:

答案 0 :(得分:1)

Scan.setCaching用于在一次RPC调用中指定结果计数,当您将其设置为100时,您的客户端将获得100乘100的结果,如果有100个结果,如果没有,您将获得精确的结果计数一个rpc电话。 SetCaching是与网络性能相关的优化,并且不会从您获得的数据库中更改结果计数。

对于有序的结果,例如,最后100,你需要定义什么是最后的?用户的最后100个活动,或所有表中最后100个插入的行?如果你的意思是表,hbase不会按照你写的顺序返回你的数据,它将按行键字节值的顺序返回,所以你应该让你的rowkey时间基于获得有序的结果。但是rowkey的第一部分的时间会产生热点区域,所以你不应该这样做:)