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

Posted

技术标签:

【中文标题】如何将最新的 100 行从 Hbase 加载到 Spark【英文标题】:How to load the latest 100 rows from Hbase to Spark 【发布时间】:2015-12-23 16:23:42 【问题描述】:

我正在使用 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】:

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

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

【讨论】:

以上是关于如何将最新的 100 行从 Hbase 加载到 Spark的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 shell 脚本加载 Hbase 表

HBase表中批量加载的详细步骤

如何使用 talend 中的 tmysql 行将唯一行从数据库加载到数据仓库中

如何将平面文件(非分隔文件)加载到 HBase?

将数据一次性加载到DataSet与逐行从DB内读取的性能比较

hbase读写优化