遍历 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{
...
}
我有一行包含特定单元格的多个版本。 我想获取并迭代此单元格的所有现有版本。类似于:
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{
...
}