El conector de Kudu le permite consultar, insertar y eliminar datos almacenados en tablas de Apache Kudu.
Contexto
El conector de Kudu abarca los siguientes temas:
Requisitos previos
Debe contar con un clúster de Trino y un clúster de Hadoop con el servicio Kudu creados. Para obtener más información, consulte Create a cluster.
Limitaciones
Kudu 1.10 o posterior.
Conectividad de red entre los clústeres de Trino y Hadoop.
Los nombres de tablas y columnas de Kudu deben estar en minúsculas.
Modificar la configuración del conector de Kudu
Para obtener más información, consulte Configure connectors.
En la consola de E-MapReduce (EMR), vaya a la página Configure del servicio Trino. En el área Service Configuration, haga clic en la pestaña kudu.properties.
|
Parámetro |
Descripción |
|
kudu.client.master-addresses |
Lista de direcciones maestras de Kudu separadas por comas. Se admiten los siguientes formatos: example.com, example.com:7051, 192.0.2.1, 192.0.2.1:7051, [2001:db8::1], [2001:db8::1]:7051 y 2001:db8::1. Valor predeterminado: localhost. Nota
Para escribir datos en tablas de Kudu y consultarlos, cambie el valor predeterminado de localhost a la dirección IP o nombre de host del nodo maestro de Kudu; por ejemplo, master-1-1. |
|
kudu.schema-emulation.enabled |
Indica si se habilita la emulación de esquemas.
Importante
Para agregar este elemento, haga clic en Add Configuration Item en la pestaña kudu.properties. Para consultar las instrucciones, vea Add configuration items. |
|
kudu.schema-emulation.prefix |
Prefijo para la emulación de esquemas. Importante
Este elemento de configuración es obligatorio cuando El prefijo estándar es |
|
kudu.client.default-admin-operation-timeout |
Tiempo de espera predeterminado para operaciones administrativas, como Create Table y Delete Table. Valor predeterminado: 30s. |
|
kudu.client.default-operation-timeout |
Tiempo de espera predeterminado para operaciones de usuario. Valor predeterminado: 30s. |
|
kudu.client.default-socket-read-timeout |
Tiempo de espera predeterminado para recibir datos de un socket. Valor predeterminado: 10s. |
|
kudu.client.disable-statistics |
Indica si se deshabilita la recopilación de estadísticas del cliente de Kudu.
|
Consultar datos
Apache Kudu no admite esquemas de forma nativa. No obstante, puede configurar el conector de Kudu para emularlos.
Emulación de esquemas deshabilitada (predeterminado)
De forma predeterminada, la emulación de esquemas está deshabilitada. En este caso, todas las tablas de Kudu se encuentran en el esquema default.
Por ejemplo, para consultar la tabla orders, ejecute SELECT * FROM kudu.default.orders. Si el catálogo y el esquema están configurados como kudu y default respectivamente, puede simplificar la consulta a SELECT * FROM orders.
Los nombres de las tablas de Kudu pueden contener cualquier carácter. Si un nombre incluye caracteres especiales, debe encerrarlo entre comillas dobles ("). Por ejemplo, para consultar la tabla special.table!, ejecute SELECT * FROM kudu.default."special.table!".
Ejemplos:
-
Cree una tabla
usersen el esquemadefault.CREATE TABLE kudu.default.users ( user_id int WITH (primary_key = true), first_name varchar, last_name varchar ) WITH ( partition_by_hash_columns = ARRAY['user_id'], partition_by_hash_buckets = 2 );NotaAl crear una tabla, debe especificar información obligatoria, como la clave principal, los formatos de codificación y compresión de columnas, y las particiones por hash o por rango.
-
Consulte la información de la tabla.
DESCRIBE kudu.default.users;El comando devuelve un resultado similar al siguiente:
Column | Type | Extra | Comment ------------+---------+-------------------------------------------------+--------- user_id | integer | primary_key, encoding=auto, compression=default | first_name | varchar | nullable, encoding=auto, compression=default | last_name | varchar | nullable, encoding=auto, compression=default | (3 rows) -
Inserte datos.
INSERT INTO kudu.default.users VALUES (1, 'Donald', 'Duck'), (2, 'Mickey', 'Mouse'); -
Consulte los datos.
SELECT * FROM kudu.default.users;
Emulación de esquemas habilitada
Si habilita la emulación de esquemas en el archivo de configuración del conector (etc/catalog/kudu.properties), las tablas se asignan a esquemas según una convención de nomenclatura.
-
Si establece
kudu.schema-emulation.enabled=trueykudu.schema-emulation.prefix=, las tablas se asignan de la siguiente manera:Nombre de tabla en Kudu
Nombre de tabla en Presto
orderskudu.default.orderspart1.part2kudu.part1.part2x.y.zkudu.x."y.z"NotaDado que Kudu no admite esquemas de forma nativa, Presto crea una tabla especial llamada
$schemaspara gestionarlos. -
Si establece
kudu.schema-emulation.enabled=trueykudu.schema-emulation.prefix=presto::, las tablas se asignan de la siguiente manera:Nombre de tabla en Kudu
Nombre de tabla en Presto
orderskudu.default.orderspart1.part2kudu.default."part1.part2"x.y.zkudu.default."x.y.z"presto::part1.part2kudu.part1.part2presto::x.y.zkudu.x."y.z"NotaDado que Kudu no admite esquemas de forma nativa, Presto crea una tabla especial llamada
presto::$schemaspara gestionarlos.
Mapeo de tipos de datos
La siguiente tabla muestra el mapeo de tipos de datos entre Presto y Kudu.
|
Tipo en Presto |
Tipo en Kudu |
Observaciones |
|
BOOLEAN |
BOOL |
N/A |
|
TINYINT |
INT8 |
|
|
SMALLINT |
INT16 |
|
|
INTEGER |
INT32 |
|
|
BIGINT |
INT64 |
|
|
REAL |
FLOAT |
|
|
DOUBLE |
DOUBLE |
|
|
VARCHAR |
STRING |
Al crear una tabla de Kudu a partir de una tabla de Presto mediante la sentencia |
|
VARBINARY |
BINARY |
|
|
TIMESTAMP |
UNIXTIME_MICROS |
Este mapeo reduce la precisión de la columna de Kudu de microsegundos (µs) a milisegundos (ms). |
|
DECIMAL |
DECIMAL |
Compatible solo con Kudu 1.7.0 y versiones posteriores. |
|
DATE |
N/A |
No compatible. Al crear una tabla de Kudu a partir de una tabla de Presto mediante la sentencia |
|
CHAR |
N/A |
No compatible. |
|
TIME |
||
|
JSON |
||
|
TIME WITH TIME ZONE |
||
|
TIMESTAMP WITH TIME ZONE |
||
|
INTERVAL YEAR TO MONTH |
||
|
INTERVAL DAY TO SECOND |
||
|
ARRAY |
||
|
MAP |
||
|
IPADDRESS |
Sentencias SQL de Presto compatibles
La sentencia ALTER SCHEMA ... RENAME TO ... no es compatible.
|
Sentencia |
Descripción |
|
|
Ninguna. |
|
|
Ninguna. |
|
|
Ninguna. |
|
|
Ninguna. |
|
|
Disponible solo cuando la emulación de esquemas está habilitada. |
|
|
Disponible solo cuando la emulación de esquemas está habilitada. |
|
|
Crea una tabla. Para más detalles, consulte Create a table. |
|
|
Ninguna. |
|
|
Ninguna. |
|
|
Ninguna. |
|
|
Agrega una columna. Para más detalles, consulte Add a column. |
|
|
Estas sentencias solo aplican a columnas que no forman parte de la clave principal. |
|
|
|
|
|
Ninguna. |
|
|
Ninguna. |
|
|
Ninguna. |
|
|
Ninguna. |
|
|
Esta sentencia equivale a |
|
|
Agrega una partición por rango. Para más detalles, consulte Range partitions. |
|
|
Elimina una partición por rango. Para más detalles, consulte Range partitions. |
Crear una tabla
Para crear una tabla, especifique sus columnas, tipos de datos e información de particionamiento. También puede definir otros detalles, como el formato de codificación o compresión de las columnas. A continuación se muestra un ejemplo.
CREATE TABLE user_events (
user_id int WITH (primary_key = true),
event_name varchar WITH (primary_key = true),
message varchar,
details varchar WITH (nullable = true, encoding = 'plain')
) WITH (
partition_by_hash_columns = ARRAY['user_id'],
partition_by_hash_buckets = 5,
number_of_replicas = 3
);
En este ejemplo, la clave principal consta de las columnas user_id y event_name. La tabla se divide en cinco particiones según los valores hash de la columna user_id. El parámetro number_of_replicas se establece en 3.
Al crear una tabla, tenga en cuenta lo siguiente:
Las columnas de clave principal deben aparecer primero. Las columnas de clave de partición deben ser un subconjunto de las columnas de clave principal.
number_of_replicas: Número de réplicas de tablet, que debe ser un número impar. Si no se especifica, se utiliza el valor predeterminado de la configuración de Kudu Master.Kudu admite particiones por hash y por rango. Una partición por hash distribuye las filas en cubetas según un valor hash. Una partición por rango distribuye las filas según una clave de partición ordenada, y sus rangos específicos deben crearse explícitamente. Kudu admite particionamiento multinivel. Una tabla debe tener al menos una partición por hash o por rango. Puede tener varias particiones por hash, pero como máximo una partición por rango.
Propiedades de columna
Además del nombre y el tipo de datos, puede especificar las siguientes propiedades de columna.
|
Parámetro |
Tipo |
Descripción |
|
primary_key |
BOOLEAN |
Si es verdadero, esta columna forma parte de la clave principal. Una clave principal de Kudu impone una restricción de unicidad. Si inserta una fila con una clave principal que ya existe, la fila existente se actualiza. Para obtener más información, consulte Primary Key Design. |
|
nullable |
BOOLEAN |
Si es verdadero, la columna puede ser nula. Importante
Las columnas de clave principal no pueden ser nulas. |
|
encoding |
VARCHAR |
Formato de codificación de la columna, que reduce el almacenamiento y mejora el rendimiento de las consultas. Si no se especifica, Kudu selecciona automáticamente una codificación según el tipo de datos de la columna. Valores válidos: auto, plain, bitshuffle, runlength, prefix, dictionary y group_varint. Para obtener más información, consulte Column Encoding. |
|
compression |
VARCHAR |
Formato de compresión de la columna. Si no se especifica, Kudu utiliza el formato de compresión predeterminado. Valores válidos: |
A continuación se muestra un ejemplo:
CREATE TABLE mytable (
name varchar WITH (primary_key = true, encoding = 'dictionary', compression = 'snappy'),
index bigint WITH (nullable = true, encoding = 'runlength', compression = 'lz4'),
comment varchar WITH (nullable = true, encoding = 'plain', compression = 'default'),
...
) WITH (...);
Diseño de particiones
Esta sección describe cómo definir particiones por hash y por rango.
-
Partición por hash
-
Definición de un grupo de particiones
Utilice las propiedades de tabla partition_by_hash_columns y
partition_by_hash_bucketspara especificar las columnas de clave de partición y el número de particiones, respectivamente. Todas las columnas de clave de partición deben ser un subconjunto de las columnas de clave principal. A continuación se muestra un ejemplo:CREATE TABLE mytable ( col1 varchar WITH (primary_key=true), col2 varchar WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['col1', 'col2'], partition_by_hash_buckets = 4 )NotaEste ejemplo define una partición por hash en las columnas
col1ycol2, y distribuye los datos en cuatro particiones. -
Definición de dos grupos de particiones
Para definir dos grupos independientes de particiones por hash, también debe especificar las propiedades de tabla
partition_by_second_hash_columnsypartition_by_second_hash_buckets. A continuación se muestra un ejemplo:CREATE TABLE mytable ( col1 varchar WITH (primary_key=true), col2 varchar WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['col1'], partition_by_hash_buckets = 2, partition_by_second_hash_columns = ARRAY['col2'], partition_by_second_hash_buckets = 3 )NotaEste ejemplo define dos grupos de particiones por hash. El primer grupo distribuye las filas en dos particiones según la columna
col1. El segundo grupo distribuye las filas en tres particiones según la columnacol2. La tabla tiene un total de seis particiones (2 × 3).
-
-
Partición por rango
Una tabla de Kudu puede tener como máximo una partición por rango, la cual se define mediante la propiedad de tabla
partition_by_range_columns. Al crear la tabla, puede definir los rangos de partición mediante la propiedad de tablarange_partitions. Para gestionar particiones por rango en una tabla existente, utilice los procedimientos almacenadoskudu.system.add_range_partitionykudu.system.drop_range_partition. A continuación se muestra un ejemplo:CREATE TABLE events ( rack varchar WITH (primary_key=true), machine varchar WITH (primary_key=true), event_time timestamp WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['rack'], partition_by_hash_buckets = 2, partition_by_second_hash_columns = ARRAY['machine'], partition_by_second_hash_buckets = 3, partition_by_range_columns = ARRAY['event_time'], range_partitions = '[{"lower": null, "upper": "2018-01-01T00:00:00"}, {"lower": "2018-01-01T00:00:00", "upper": null}]' )NotaEste ejemplo define una tabla con dos grupos de particiones por hash y una partición por rango en la columna
event_time. El rango se divide en la marca de tiempo2018-01-01T00:00:00. -
Gestión de particiones por rango
Los siguientes ejemplos muestran operaciones de particionamiento:
-
Agregar una partición por rango
CALL kudu.system.add_range_partition(<YOUR_SCHEMA_NAME>, <YOUR_TABLE_NAME>, <range_partition_as_json_string>) -
Eliminar una partición por rango
CALL kudu.system.drop_range_partition(<YOUR_SCHEMA_NAME>, <YOUR_TABLE_NAME>, <range_partition_as_json_string>)
Parámetro
Descripción
<YOUR_SCHEMA_NAME>Esquema donde se encuentra la tabla.
<YOUR_TABLE_NAME>Nombre de la tabla.
<range_partition_as_json_string>Límites superior e inferior de la partición por rango, especificados como una cadena JSON. Utilice el formato
'{"lower": <value>, "upper": <value>}'. Si la partición tiene varias columnas, utilice el formato'{"lower": [<value_col1>,...], "upper": [<value_col1>,...]}'. El formato del valor depende del tipo de datos de la columna. La siguiente lista muestra el mapeo de tipos de datos a sus formatos de cadena JSON requeridos:-
BIGINT:
'{"lower": 0, "upper": 1000000}' -
SMALLINT:
'{"lower": 10, "upper": null}' -
VARCHAR:
'{"lower": "A", "upper": "M"}' -
TIMESTAMP:
'{"lower": "2018-02-01T00:00:00.000", "upper": "2018-02-01T12:00:00.000"}' -
BOOLEAN:
'{"lower": false, "upper": true}' -
VARBINARY: Una cadena codificada en Base64.
NotaUn valor
nullindica un límite no acotado.A continuación se muestra un ejemplo:
CALL kudu.system.add_range_partition('myschema', 'events', '{"lower": "2018-01-01", "upper": "2018-06-01"}')NotaEste ejemplo agrega una partición por rango a la tabla
eventsen el esquemamyschema. El límite inferior de la partición es2018-01-01, que corresponde a la marca de tiempo2018-01-01T00:00:00.000. El límite superior es2018-06-01.Utilice la sentencia
SHOW CREATE TABLEpara consultar las particiones por rango existentes. Esta información aparece en la propiedad de tablarange_partitions. -
Agregar una columna
Utilice la sentencia ALTER TABLE ... ADD COLUMN ... para agregar una columna a una tabla existente. También puede especificar propiedades para la nueva columna. Para obtener detalles sobre las propiedades de columna, consulte Create a table.
ALTER TABLE mytable ADD COLUMN extraInfo varchar WITH (nullable = true, encoding = 'plain')