遍历 BigTable 行上的单元格版本

Iterate over cell versions on BigTable row

我有一行包含特定单元格的多个版本。 我想获取并迭代此单元格的所有现有版本。类似于:

for _, cellVersion := range row["ColumnFamily"]["ColumnQualifier"]{
   // (...)
}

我尝试使用函数 ReadRow 但它 returns 一个 map[string][]ReadItem 显然是一维元胞数组。

row, err := table.ReadRow(ctx, rowKey)
row["MyColumnFamily"] // -> array of unidimensional cells

您应该能够获取特定列的行,然后遍历所有结果:

rowkey := "YOUR_KEY"
row, err := tbl.ReadRow(ctx, rowkey, bigtable.RowFilter(bigtable.ColumnFilter("ColumnQualifier")))
if err != nil {
    log.Fatalf("Could not read row with key %s: %v", rowkey, err)
}

printRow(w, row)

func printRow(w io.Writer, row bigtable.Row) {
    fmt.Fprintf(w, "Reading data for %s:\n", row.Key())
    for columnFamily, cols := range row {
        fmt.Fprintf(w, "Column Family %s\n", columnFamily)
        for _, col := range cols {
            qualifier := col.Column[strings.IndexByte(col.Column, ':')+1:]
            fmt.Fprintf(w, "\t%s: %s @%d\n", qualifier, col.Value, col.Timestamp)
        }
    }
    fmt.Fprintln(w)
}

我提出问题的原因是 BigTable 数据模型支持每个单元格的多个版本。 Over-simplistically:每个单元格都是一个 multi-dimensional 数组,由相似数据的不同版本组成。

PythonSDK 以非常直接的方式实现了这个概念:每个单元格都表示为一个项目列表(可能版本的列表)。

>>> row = table.read_row(ROW_KEY)
>>> data = row.to_dict()
>>> cell = data[<COLUMN_FAMILY:COLUMN_QUALIFIER>]
[<Cell value=b'bla1' timestamp=2020-01-16 21:45:39.921000>, <Cell value=b'bla2' timestamp=2020-01-16 21:57:31>...]

然而,在 Golang SDK 中,所有单元格的所有版本都在同一个数组中。因此,如果您想要一个包含同一单元格所有版本的数组,则必须手动对其进行分组。

row, _ := r.table.ReadRow(ctx, ROW_KEY)
columns, ok := row[<COLUMN_FAMILY>]

values := make(map[string][]bigtable.ReadItem, 0)

for _, cell := range columns {
    _, ok := values[cell.Column]
    if !ok {
        values[cell.Column] = make([]bigtable.ReadItem, 0)
    }

    values[cell.Column] = append(values[cell.Column], cell)
 }

现在我们可以访问同一单元格的不同版本列表:

cell := values[<COLUMN_FAMILY:COLUMN_QUALIFIER>]
for _, cellVersion := range cell{
    ...
}