Hbase Google Cloud Bigtable:Java查询多前缀扫描

Hbase Google Cloud Bigtable:Java查询多前缀扫描,hbase,google-cloud-bigtable,Hbase,Google Cloud Bigtable,在我们的项目中,我们有一个需求,我们将不得不进行多前缀扫描和查询BigTable 例如,引用BigTable下面的行键 1st 4 rows have prefix 9JNzZAGX, 2nd 3 rows have prefix sRbfH5fW, 3rd 1 rows have prefix PnQvPYtA, 4th 2 rows have prefix C7M5fjUg, 如果我必须获取以前缀sRbfH5fW和C7M5fjUg开头的行,则需要返回以下5行 sRbfH5fW-PLez7

在我们的项目中,我们有一个需求,我们将不得不进行多前缀扫描和查询BigTable

例如,引用BigTable下面的行键

1st 4 rows have prefix 9JNzZAGX, 
2nd 3 rows have prefix sRbfH5fW,
3rd 1 rows have prefix PnQvPYtA,
4th 2 rows have prefix C7M5fjUg,
如果我必须获取以前缀sRbfH5fW和C7M5fjUg开头的行,则需要返回以下5行

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

如果有办法使用JavaAPI,我可以通过对DB的一次调用获取它们。此前缀LKist可以是100秒,因此对每个前缀并行或顺序搜索代码听起来不是一个好选项。

执行以下操作:

    // 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的问题具有挑战性。

执行以下操作:

    // 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的问题具有挑战性。

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

  Query query = Query.create(tableId).prefix("phone");
  ServerStream<Row> rows = dataClient.readRows(query);
Query-Query=Query.create(tableId).prefix(“电话”);
ServerStream rows=dataClient.readRows(查询);
实际上,您可以在查询中再次调用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());
}
try(BigtableDataClient=BigtableDataClient.create(projectId,instanceId)){
查询=
Query.create(tableId)
.前缀(“9JNzZAGX”)
.前缀(“sRbfH5fW”)
.前缀(“PnQvPYtA”)
.前缀(“C7M5FJG”);
ServerStream rows=dataClient.readRows(查询);
用于(行:行){
//做点什么
}
}捕获(IOE异常){
System.out.println(
无法初始化服务客户端,因为发生网络错误:\n“+e.toString());
}

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

  Query query = Query.create(tableId).prefix("phone");
  ServerStream<Row> rows = dataClient.readRows(query);
Query-Query=Query.create(tableId).prefix(“电话”);
ServerStream rows=dataClient.readRows(查询);
实际上,您可以在查询中再次调用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());
}
try(BigtableDataClient=BigtableDataClient.create(projectId,instanceId)){
查询=
Query.create(tableId)
.前缀(“9JNzZAGX”)
.前缀(“sRbfH5fW”)
.前缀(“PnQvPYtA”)
.前缀(“C7M5FJG”);
ServerStream rows=dataClient.readRows(查询);
用于(行:行){
//做点什么
}
}捕获(IOE异常){
System.out.println(
无法初始化服务客户端,因为发生网络错误:\n“+e.toString());
}

请告诉我,如何在一次呼叫中获取多个前缀。这是主要问题。不能同时查询多个行键前缀。您必须为每个行前缀生成不同的调用。如果你想这样做,那么你应该考虑改变BigTABLE表的模式,以帮助你更有效地获取你想要的数据。查看此以了解更多信息。这里的关键点是找到您试图查询的这些数据之间的共同点。您能告诉我,如何在一次调用中使用多个前缀进行提取。这是主要问题。不能同时查询多个行键前缀。您必须为每个行前缀生成不同的调用。如果你想这样做,那么你应该考虑改变BigTABLE表的模式,以帮助你更有效地获取你想要的数据。查看此以了解更多信息。这里的关键点是找到您试图查询的这些数据之间的共同点。