设置 cbt CLI 的输出的格式

本文档介绍了如何在 cbt CLI 显示 Bigtable 行中存储的特定类型的数据时设置其格式。

格式设置示例

从 0.12.0 版开始,cbt CLI 可以设置表行中存储的特定复杂类型的数据的格式。使用 cbt readcbt lookup 命令时,cbt CLI 可以“美观输出”行中存储的值。

以下示例展示了 cbt CLI 的不带格式的数据输出。

----------------------------------------
r1
  fam1:col1                                 @ 2022/03/09-11:19:45.966000
    "\n\x05Brave\x10\x02"
  fam1:col2                                 @ 2022/03/14-11:17:20.014000
    "{\"name\": \"Brave\", \"age\": 2}"

以下示例展示了 cbt CLI 的带格式的数据输出。

r1
  fam1:col1                                 @ 2022/03/09-11:19:45.966000
    name: "Brave"
    age: 2
  fam1:col2                                 @ 2022/03/14-11:17:20.014000
    age:     2.00
    name:   "Brave"

如需设置列或列族的格式,您必须提供一个 YAML 文件来指定该列的格式。调用 cbt lookupcbt read 时,您可以使用 format-file 参数传入 YAML 文件的路径。以下代码段展示了使用所提供的 format-file 参数调用 cbt lookup 的示例。

cbt lookup my-table r1 format-file=/path/to/formatting.yml

在 YAML 中定义列数据格式

YAML 格式设置文件必须将列名称或列族名称与其中存储的数据类型相关联。以下代码段展示了 YAML 格式设置文件的示例。

protocol_buffer_definitions:
  - cat.proto
protocol_buffer_paths:
  - testdata/


columns:
  col1:
    encoding: ProtocolBuffer
    type: Cat

  col2:
    encoding: json

以下代码段显示了“cat.proto”的内容。

syntax = "proto3";
package cats;

option go_package = "github.com/protocolbuffers/protobuf/examples/go/tutorialpb";

message Cat {
  string name = 1;
  int32 age = 2;
}

我们来看一下示例:

  • protocol_buffer_definitions 字段提供了 .proto 文件列表,其中可包含用于对 protobuf 数据进行解码的协议缓冲区消息类型。
  • protocol_buffer_paths 字段提供一系列本地路径,其中可以包含用于解码协议缓冲区类型的 .proto 文件。 您无需指定标准协议缓冲区导入项的位置,例如 google/protobuf 软件包中的消息。
  • columns 字段包含列名称列表以及每列对应的数据类型:

    • protobuf 列的 encoding 设置为“ProtocolBuffer”,type 设置为“Cat”。cbt CLI 会将存储在此列中的所有值解释并设置格式为 Cat proto 消息类型。该类型必须与为 protocol_buffer_definition 字段提供的 .proto 文件之一中定义的消息类型相符。
    • json 列的 encoding 字段设置为“json”。cbt 将此列中存储的所有值解释并设置为 JSON 结构。

您可以提供的其他字段包括:

  • default_encoding:此字段用于为表中的所有列或列族中的所有列定义默认格式。
  • default_type:此字段定义了协议缓冲区、大端字节序和小端字节序编码列的默认数据类型。
  • families:此字段用于定义列族中所有列的编码和类型。您可以为列族提供 default_encodingdefault_type。您还可以在列级替换这些编码,方法是提供一个 columns 字段,其中按名称列出列以及相应的编码和数据类型,如以下代码段所示:

    families:
      family1:
        default_encoding: BigEndian
        default_type: INT64
        columns:
          address:
            encoding: PROTO
            type: tutorial.Person
    

支持的数据类型

cbt CLI 支持对多种复杂数据类型进行格式设置。下表列出了 YAML 文件中为每种列表类型提供的支持的数据类型和字符串。字符串值不区分大小写。

数据类型 YAML 的格式值
十六进制 HexH
大端字节序 BigEndianB
小端字节序 LittleEndianL
协议缓冲区 ProtocolBufferPPROTO
JSON JSONJ

表 1:支持在 cbt 输出中设置格式的数据类型。

  • 十六进制编码与类型无关。数据显示为存储数据的原始十六进制表示形式。
  • big-endian 和 little-endian 编码的可用类型为 int8int16int32int64uint8uint16uint32uint64float32float64。存储的数据长度必须是类型大小的倍数,以字节为单位。如果存储的长度与类型大小相符,则数据显示为标量;否则,数据显示为数组。类型名称不区分大小写。
  • 为协议缓冲区编码提供的类型必须与提供的协议缓冲区定义文件中定义的消息类型相匹配。这些类型不区分大小写。如果未指定类型,则默认为所显示的列数据的列名称。
  • YAML 的格式值不区分大小写。