将HBase Scan转换为RowFilter

时间:2017-06-20 18:47:21

标签: scala google-cloud-bigtable spotify-scio

我使用spotify中的scio作为我的Dataflow作业。 在最后一个scio版本中,使用了新的bigtable java api(com.google.bigtable.v2)

现在需要scio bigtable entry point" RowFilter"过滤而不是Hbase"扫描"。是否有一种简单的方法可以转换"扫描"到" RowFilter" ?我在源代码中查找了adapters,但我不确定如何使用它。 我找不到文档,可以轻松地从hbase api迁移到" new" API。

我在代码中使用的一个简单扫描,我需要转换:

val scan = new Scan()
scan.setRowPrefixFilter("helloworld".getBytes)
scan.addColumn("family".getBytes, "qualifier".getBytes)
scan.setMaxVersions()

1 个答案:

答案 0 :(得分:1)

理论上,您可以将bigtable-hbase dependency添加到项目中,然后致电com.google.cloud.bigtable.hbase.adapters.Adapters.SCAN_ADAPTER.adapt(scan)Scan转换为RowFilter,或者更具体地说是[ReadRowsRequest][3]其中包含[RowFilter][4]。 (链接指向那些包含变量和广泛注释的对象的protobuf定义。)

也就是说,bigtable-hbase依赖增加了很多传递依赖。我会在独立项目中使用bigtable-hbase SCAN_ADAPTER,然后打印RowFilter以查看它是如何构建的。

在您提到的具体情况中,RowFilter非常简单,但可能会有其他并发症。扫描有三个部分,因此我将分析如何实现它们:

  1. scan.setRowPrefixFilter("helloworld".getBytes)。这会转换为BigtableIO上的开始键和结束键。 "的HelloWorld"是开始键,您可以使用RowKeyUtil. calculateTheClosestNextRowKeyForPrefix计算结束键。默认BigtableIO不公开set start键和set end key,因此必须更改scio版本以使这些setter公开。

  2. scan.addColumn("family".getBytes, "qualifier".getBytes)转换为RowFilter添加到RowFilterChain(大部分类似于AND)。第一个RowFilter将设置familyNameRegexFilter,第二个RowFilter将具有columnNameRegexFilter

  3. scan.setMaxVersions()转换为RowFilter并设置cellsPerColumnLimitFilter。它需要被添加到#2的链中。警告:如果您使用timestampRangeFilter的{​​{1}}或值过滤器来限制列的范围,请务必将RowFilter放在链的末尾。