如何将最新的 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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 talend 中的 tmysql 行将唯一行从数据库加载到数据仓库中