googlecloud bigtable:java查询多前缀扫描

kxe2p93d  于 2021-06-07  发布在  Hbase
关注(0)|答案(2)|浏览(397)

在我们的项目中,我们有一个要求,我们将不得不进行多前缀扫描和查询bigtable。
例如,引用bigtable的below行键

1st 4 rows have prefix 9JNzZAGX, 
2nd 3 rows have prefix sRbfH5fW,
3rd 1 rows have prefix PnQvPYtA,
4th 2 rows have prefix C7M5fjUg,
9JNzZAGX-hkncRBPb
9JNzZAGX-gFfXvVxx
9JNzZAGX-saQaP62S
9JNzZAGX-S5prLFns

sRbfH5fW-PLez7PF5
sRbfH5fW-Pg5PJjuq
sRbfH5fW-7HfgXgJe

PnQvPYtA-UUNC4mhw

C7M5fjUg-6nvM2ReV
C7M5fjUg-hSpQungj

如果必须获取以前缀srbfh5fw和c7m5fjug开头的行,则需要返回以下5行。

sRbfH5fW-PLez7PF5
sRbfH5fW-Pg5PJjuq
sRbfH5fW-7HfgXgJe
C7M5fjUg-6nvM2ReV
C7M5fjUg-hSpQungj

如果有一种使用javaapi的方法,我可以在对db的一次调用中获取它们。这个前缀lkist可以是100秒,因此在代码中并行或顺序搜索每一个听起来都不是一个好的选择。

tcbh2hod

tcbh2hod1#

对于一个前缀扫描,您将使用您似乎知道的内置前缀扫描:

Query query = Query.create(tableId).prefix("phone");
  ServerStream<Row> rows = dataClient.readRows(query);

实际上,您可以在查询上再次调用prefix,它将添加更多前缀,这对于您的用例来说应该非常简单:

try (BigtableDataClient dataClient = BigtableDataClient.create(projectId, instanceId)) {
  Query query =
      Query.create(tableId)
          .prefix("9JNzZAGX")
          .prefix("sRbfH5fW")
          .prefix("PnQvPYtA")
          .prefix("C7M5fjUg");
  ServerStream<Row> rows = dataClient.readRows(query);
  for (Row row : rows) {
   // DO SOMETHING
  }
} catch (IOException e) {
  System.out.println(
      "Unable to initialize service client, as a network error occurred: \n" + e.toString());
}
6ju8rftf

6ju8rftf2#

这样做:

// Creates the settings to configure a bigtable data client.

      BigtableDataSettings settings=BigtableDataSettings.newBuilder().setProjectId(projectId).setInstanceId(instanceId).build();

    // Creates a bigtable data client.

      dataClient = BigtableDataClient.create(settings);
// read row using readRow() method
      Row row = dataClient.readRow(tableId, ROW_KEY_PREFIX);
      System.out.println("Row: " + row.getKey().toStringUtf8());
      for (RowCell cell : row.getCells()) {
        System.out.printf(
            "Family: %s    Qualifier: %s    Value: %s%n",
            cell.getFamily(), cell.getQualifier().toStringUtf8(), cell.getValue().toStringUtf8());
      }

有关详细信息,请查看此页
在这里您可以找到完整的示例代码。
注意:我注意到您的行前缀是散列值,这不再是推荐的,因为它会导致行键基本上没有意义,这使得使用键可视化工具来解决cloud bigtable的问题很有挑战性。

相关问题