Formatear la salida de la CLI de cbt

En este documento se describe cómo dar formato a tipos de datos específicos almacenados en filas de Bigtable cuando se muestran con la CLI de cbt.

Ejemplos de formato

A partir de la versión 0.12.0, la cbt CLI puede dar formato a determinados tipos complejos de datos almacenados en filas de tablas. Cuando usas el comando cbt read o cbt lookup, la cbtCLI puede aplicar un formato de impresión bonito a los valores almacenados en las filas.

En el siguiente ejemplo se muestran los datos de salida de la CLI cbt sin formato.

----------------------------------------
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}"

En el siguiente ejemplo se muestran los datos de salida de la CLI de cbt con formato.

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"

Para dar formato a una columna o a una familia de columnas, debe proporcionar un archivo YAML que especifique el formato de esa columna. Cuando llamas a cbt lookup o cbt read, debes indicar la ruta al archivo YAML con el argumento format-file. En el siguiente fragmento de código se muestra un ejemplo de llamada a cbt lookup con el argumento format-file.

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

Definir formatos de datos de columna en YAML

El archivo YAML de formato debe conectar los nombres de las columnas o de las familias de columnas con los tipos de datos almacenados en ellas. El siguiente fragmento muestra un ejemplo de archivo de formato YAML.

protocol_buffer_definitions:
  - cat.proto
protocol_buffer_paths:
  - testdata/


columns:
  col1:
    encoding: ProtocolBuffer
    type: Cat

  col2:
    encoding: json

En el siguiente fragmento se muestra el contenido de "cat.proto".

syntax = "proto3";
package cats;

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

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

Analicemos el ejemplo:

  • El campo protocol_buffer_definitions proporciona una lista de archivos .proto que pueden contener tipos de mensajes de búfer de protocolo que se pueden usar para decodificar datos de protobuf.
  • El campo protocol_buffer_paths proporciona una lista de rutas locales que pueden contener archivos .proto para decodificar tipos de búfer de protocolo. No es necesario que especifiques las ubicaciones de las importaciones de búferes de protocolo estándar, como los mensajes del paquete google/protobuf.
  • El campo columns contiene una lista de nombres de columnas con los tipos de datos correspondientes de cada columna:

    • La columna protobuf tiene el valor "ProtocolBuffer" en encoding y el valor "Cat" en type. La CLI de cbt interpreta y da formato a todos los valores almacenados en esta columna como un tipo de mensaje proto Cat. El tipo debe corresponder a un tipo de mensaje definido en uno de los archivos .proto proporcionados para el campo protocol_buffer_definition.
    • La columna json tiene el campo encoding con el valor "json". cbt interpreta y da formato a todos los valores almacenados en esta columna como una estructura JSON.

Otros campos que puedes proporcionar:

  • default_encoding: este campo define un formato predeterminado para todas las columnas de una tabla o de una familia de columnas.
  • default_type: este campo define un tipo de datos predeterminado para las columnas codificadas con búfer de protocolo, big-endian y little-endian.
  • families: este campo define las codificaciones y los tipos de todas las columnas de una familia de columnas. Puedes proporcionar un default_encoding y un default_type para una familia de columnas. También puede anular estas codificaciones a nivel de columna proporcionando un campo columns que enumere las columnas por nombre con la codificación y los tipos de datos adecuados, como se muestra en el siguiente fragmento:

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

Tipos de datos admitidos

La CLI cbt admite el formato de varios tipos de datos complejos. En la siguiente tabla se muestran los tipos de datos y las cadenas que se pueden proporcionar en el archivo YAML para cada tipo de lista. Los valores de cadena no distinguen entre mayúsculas y minúsculas.

Tipo de datos Formato de valor para YAML
Hexadecimal Hex, H
Big-endian BigEndian, B
Little-endian LittleEndian, L
Búfer de protocolo ProtocolBuffer, P, PROTO
JSON JSON, J

Tabla 1. Tipos de datos admitidos para el formato en la salida cbt.

  • La codificación hexadecimal es independiente del tipo. Los datos se muestran como una representación hexadecimal sin formato de los datos almacenados.
  • Los tipos disponibles para las codificaciones big-endian y little-endian son int8, int16, int32, int64, uint8, uint16, uint32, uint64, float32 y float64. La longitud de los datos almacenados debe ser un múltiplo del tamaño del tipo en bytes. Los datos se muestran como escalares si la longitud almacenada coincide con el tamaño del tipo o como matrices en caso contrario. Los nombres de los tipos no distinguen entre mayúsculas y minúsculas.
  • Los tipos proporcionados para la codificación protocol-buffer deben coincidir con los tipos de mensaje definidos en los archivos de definición de búfer de protocolo proporcionados. Los tipos no distinguen entre mayúsculas y minúsculas. Si no se especifica ningún tipo, se usará de forma predeterminada el nombre de la columna de los datos que se muestran.
  • Los valores de formato de YAML no distinguen entre mayúsculas y minúsculas.