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

标签 java apache-spark hbase

我正在使用 Spark 将 Hbase 数据加载到 JavaPairRDD<>。现在,我想知道是否可以将最新的 100 行而不是 Hbase 中的所有行加载到 Spark 中。 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();

最佳答案

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

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

关于java - 如何从Hbase加载最新的100行到Spark,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34439871/

相关文章:

hbase - 从 HBase 中的 HDFS 导入表

java - Spock 测试线程安全失败

java - 为什么我在运行时会出现此方法不一致的情况

java - java 中的位图字体

apache-spark - 我如何将时间戳作为额外的列添加到我的数据框

java - 卡夫卡 -> Spark流 -> Hbase。任务不可序列化错误由 : java. lang.IllegalStateException 引起:作业处于 DEFINE 状态而不是 RUNNING 状态

Java 和 JNA 为 C 函数传递参数

scala - 如何从 Spark RDD 创建共现矩阵

apache-spark - Spark 中的 DataFrame orderBy 后跟 limit

hadoop - 如何在hbase中使用扫描查询条件获取所有行?