Scala 将HBase扫描转换为RowFilter

Scala 将HBase扫描转换为RowFilter,scala,google-cloud-bigtable,spotify-scio,Scala,Google Cloud Bigtable,Spotify Scio,我正在使用spotify提供的数据流作业。 在上一个scio版本中,使用了新的bigtable java api(com.google.bigtable.v2) 现在需要“RowFilter”进行筛选,而不是Hbase“Scan”。有没有简单的方法将“扫描”转换为“行过滤器”?我在源代码中查找了,但不知道如何使用它。 我找不到易于从hbase api迁移到“新”api的文档 我在代码中使用了一个简单的扫描,需要进行转换: val scan = new Scan() scan.setRowPref

我正在使用spotify提供的数据流作业。 在上一个scio版本中,使用了新的bigtable java api(com.google.bigtable.v2)

现在需要“RowFilter”进行筛选,而不是Hbase“Scan”。有没有简单的方法将“扫描”转换为“行过滤器”?我在源代码中查找了,但不知道如何使用它。 我找不到易于从hbase api迁移到“新”api的文档

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

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

理论上,您可以将添加到项目中,并调用
com.google.cloud.bigtable.hbase.adapters.adapters.SCAN\u ADAPTER.ADAPTER(SCAN)
,将
扫描
转换为
行过滤器
,或者更具体地说,转换为
[ReadRowsRequest][3]
,其中包含
[RowFilter][4]
。(链接指向包含变量和广泛注释的对象的protobuf定义)

也就是说,bigtable hbase依赖项添加了许多可传递的依赖项。我将在独立项目中使用bigtable hbase SCAN_适配器,然后打印行过滤器以查看其构造方式

在您提到的特定情况下,
RowFilter
非常简单,但可能会有额外的复杂性。您的扫描有三个部分,因此我将详细介绍如何实现它们:

  • scan.setRowPrefixFilter(“helloworld.getBytes”)
    。这将转换为
    BigtableIO
    上的开始键和结束键。“helloworld”是开始键,您可以使用计算结束键。默认的
    BigtableIO
    不公开设置开始键和设置结束键,因此必须更改scio版本以公开这些设置器

  • scan.addColumn(“family”.getBytes,“qualifier”.getBytes)
    转换为两个
    RowFilter
    s,添加到
    RowFilter
    中,带有
    链(主要类似于AND)。第一个
    RowFilter
    将设置familyNameRegexFilter,第二个
    RowFilter
    将设置columnNameRegexFilter

  • scan.setMaxVersions()
    使用
    cellsPerColumnLimitFilter
    集转换为
    RowFilter
    。它需要从#2添加到链中。警告:如果使用
    timestampRangeFilter
    RowFilter
    的值过滤器来限制列的范围,请确保将
    cellsPerColumnLimitFilter
    放在链的末尾


  • 谢谢你的帮助!“SCAN_ADAPATER”中的“adapt”方法还有第二个必需参数“readHooks”,您对如何使用它有什么解释吗?我天真地尝试了null,但它不起作用。Scio公开了“keyRange”,你认为它可以用于RangeFilter吗?Scio似乎用“PatchedBigtableIO.java”来修补现有的BigtableIO。对于setMaxVersions,我有点惊讶,我在一些作业中使用了它,它似乎可以工作。扫描适配器应该使用新的DefaultReadHooks()作为第二个参数。关于setMaxVersions(),我错了。我在考虑页面过滤器。我将编辑我的评论。