Todos los productos
Search
Centro de documentos

Tablestore:Tutoriales

Última actualización: Sep 03, 2026

En este tema se describe cómo usar Hive o HadoopMR para acceder a tablas en Tablestore.

Preparación de datos

Cree una tabla de datos llamada pet en Tablestore. La columna name es la única columna de clave primaria. A continuación se muestran datos de ejemplo.

Nota

No escriba datos en las celdas vacías. Tablestore usa una estructura de almacenamiento sin esquema. No es necesario escribir NULL en una celda sin valor.

name

owner

species

sex

birth

death

Fluffy

Harold

cat

f

1993-02-04

Claws

Gwen

cat

m

1994-03-17

Buffy

Harold

dog

f

1989-05-13

Fang

Benny

dog

m

1990-08-27

Bowser

Diane

dog

m

1979-08-31

1995-07-29

Chirpy

Gwen

bird

f

1998-09-11

Whistler

Gwen

bird

1997-12-09

Slim

Benny

snake

m

1996-04-29

Puffball

Diane

hamster

f

1999-03-30

Ejemplo de acceso con Hive

  1. Agregue HADOOP_HOME y HADOOP_CLASSPATH al archivo /etc/profile. Por ejemplo:

    export HADOOP_HOME=${YourHadoopInstallationDirectory}
    export HADOOP_CLASSPATH=emr-tablestore-1.4.2.jar:tablestore-4.3.1-jar-with-dependencies.jar:joda-time-2.9.4.jar
  2. Ejecute el comando bin/hive para iniciar Hive y luego cree una tabla externa. Por ejemplo:

    CREATE EXTERNAL TABLE pet
      (name STRING, owner STRING, species STRING, sex STRING, birth STRING, death STRING)
      STORED BY 'com.aliyun.openservices.tablestore.hive.TableStoreStorageHandler'
      WITH SERDEPROPERTIES(
        "tablestore.columns.mapping"="name,owner,species,sex,birth,death")
      TBLPROPERTIES (
        "tablestore.endpoint"="YourEndpoint",
        "tablestore.access_key_id"="YourAccessKeyId",
        "tablestore.access_key_secret"="YourAccessKeySecret",
        "tablestore.table.name"="pet");

    A continuación se describen los elementos de configuración.

    Elemento de configuraciónDescripción
    WITH SERDEPROPERTIES

    Configuración de asignación de campos que incluye la opción tablestore.columns.mapping.
    De forma predeterminada, los nombres de los campos de la tabla externa coinciden con los nombres de las columnas de la tabla en Tablestore, ya sean columnas de clave primaria o de atributos. Si los nombres de los campos de la tabla externa no coinciden con los nombres de las columnas (por ejemplo, al distinguir entre mayúsculas y minúsculas o resolver problemas de conjuntos de caracteres), especifique tablestore.columns.mapping. Este parámetro es una cadena separada por comas. No agregue espacios después de las comas. Cada elemento corresponde a un nombre de columna de la tabla y el orden debe coincidir con el de los campos en la tabla externa.

    Nota

    Los nombres de las columnas en Tablestore pueden contener espacios en blanco. Un espacio en blanco se considera parte del nombre de la columna.

    TBLPROPERTIES

    Configuración de propiedades de la tabla. Incluye las siguientes opciones:

    • tablestore.endpoint (obligatorio): endpoint para acceder a Tablestore. Consulte el endpoint de una instancia en la consola de Tablestore. Para obtener más información sobre endpoints, consulte Endpoints.

    • tablestore.instance (opcional): nombre de la instancia de Tablestore. Si deja este parámetro en blanco, se usará el primer segmento de tablestore.endpoint. Para obtener más información sobre instancias, consulte Instances.

    • tablestore.access_key_id (obligatorio): AccessKey ID de su cuenta de Alibaba Cloud o usuario de Resource Access Management (RAM). Para obtener más información, consulte Obtain an AccessKey pair. Para usar Security Token Service (STS) y acceder temporalmente a recursos, establezca este parámetro con el AccessKey ID de la credencial de acceso temporal.

    • tablestore.access_key_secret (obligatorio): AccessKey secret de su cuenta de Alibaba Cloud o usuario de RAM. Para obtener más información, consulte Obtain an AccessKey pair. Para usar STS y acceder temporalmente a recursos, establezca este parámetro con el AccessKey secret de la credencial de acceso temporal.

    • tablestore.sts_token (opcional): token de seguridad de la credencial de acceso temporal. Establezca este parámetro solo cuando use STS para acceder temporalmente a recursos. Para obtener más información, consulte Use a RAM policy to grant permissions to a RAM user.

    • tablestore.table.name (obligatorio): nombre de la tabla correspondiente en Tablestore.

  3. Consulte los datos de la tabla.

    • Ejecute el comando SELECT * FROM pet; para consultar todas las filas de la tabla.

      El comando devuelve el siguiente resultado:

      Bowser  Diane   dog     m       1979-08-31      1995-07-29
      Buffy   Harold  dog     f       1989-05-13      NULL
      Chirpy  Gwen    bird    f       1998-09-11      NULL
      Claws   Gwen    cat     m       1994-03-17      NULL
      Fang    Benny   dog     m       1990-08-27      NULL
      Fluffy  Harold  cat     f       1993-02-04      NULL
      Puffball        Diane   hamster f       1999-03-30      NULL
      Slim    Benny   snake   m       1996-04-29      NULL
      Whistler        Gwen    bird    NULL    1997-12-09      NULL
      Time taken: 5.045 seconds, Fetched 9 row(s)
    • Ejecute el comando SELECT * FROM pet WHERE birth > "1995-01-01"; para consultar las filas donde el valor de la columna birth es posterior a 1995-01-01.

      El comando devuelve el siguiente resultado:

      Chirpy  Gwen    bird    f       1998-09-11      NULL
      Puffball        Diane   hamster f       1999-03-30      NULL
      Slim    Benny   snake   m       1996-04-29      NULL
      Whistler        Gwen    bird    NULL    1997-12-09      NULL
      Time taken: 1.41 seconds, Fetched 4 row(s)

Ejemplo de acceso con HadoopMR

El siguiente ejemplo muestra cómo usar un programa HadoopMR para contar las filas en la tabla de datos pet.

  • Construya los mappers y reducers.

    public class RowCounter {
    public static class RowCounterMapper
    extends Mapper<PrimaryKeyWritable, RowWritable, Text, LongWritable> {
        private final static Text agg = new Text("TOTAL");
        private final static LongWritable one = new LongWritable(1);
    
        @Override
        public void map(
            PrimaryKeyWritable key, RowWritable value, Context context)
            throws IOException, InterruptedException {
            context.write(agg, one);
        }
    }
    
    public static class IntSumReducer
    extends Reducer<Text,LongWritable,Text,LongWritable> {
    
        @Override
        public void reduce(
            Text key, Iterable<LongWritable> values, Context context)
            throws IOException, InterruptedException {
            long sum = 0;
            for (LongWritable val : values) {
                sum += val.get();
            }
            context.write(key, new LongWritable(sum));
        }
    }
    }

    El método map() del mapper se invoca cada vez que el origen de datos lee una fila de Tablestore. Los parámetros PrimaryKeyWritable y RowWritable corresponden a la clave primaria y al contenido de la fila. Invoque PrimaryKeyWritable.getPrimaryKey() y RowWritable.getRow() para obtener el objeto de clave primaria y el objeto de fila definidos por el SDK de Java de Tablestore.

  • Configure Tablestore como origen de datos del mapper.

    private static RangeRowQueryCriteria fetchCriteria() {
        RangeRowQueryCriteria res = new RangeRowQueryCriteria("YourTableName");
        res.setMaxVersions(1);
        List<PrimaryKeyColumn> lower = new ArrayList<PrimaryKeyColumn>();
        List<PrimaryKeyColumn> upper = new ArrayList<PrimaryKeyColumn>();
        lower.add(new PrimaryKeyColumn("YourPkeyName", PrimaryKeyValue.INF_MIN));
        upper.add(new PrimaryKeyColumn("YourPkeyName", PrimaryKeyValue.INF_MAX));
        res.setInclusiveStartPrimaryKey(new PrimaryKey(lower));
        res.setExclusiveEndPrimaryKey(new PrimaryKey(upper));
        return res;
    }
    
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "row count");
        job.addFileToClassPath(new Path("hadoop-connector.jar"));
        job.setJarByClass(RowCounter.class);
        job.setMapperClass(RowCounterMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        job.setInputFormatClass(TableStoreInputFormat.class);
        TableStoreInputFormat.setEndpoint(job, "https://YourInstance.Region.ots.aliyuncs.com/");
        TableStoreInputFormat.setCredential(job, "YourAccessKeyId", "YourAccessKeySecret");
        TableStoreInputFormat.addCriteria(job, fetchCriteria());
        FileOutputFormat.setOutputPath(job, new Path("output"));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }

    En este ejemplo, job.setInputFormatClass(TableStoreInputFormat.class) establece Tablestore como origen de datos. También debe realizar las siguientes operaciones:

    • Despliegue hadoop-connector.jar en el clúster y agréguelo al classpath. Use addFileToClassPath() para especificar la ruta local de hadoop-connector.jar. Este ejemplo asume que hadoop-connector.jar se encuentra en la ruta actual.

    • Especifique el punto de entrada y la identidad necesarios para acceder a Tablestore. Use TableStoreInputFormat.setEndpoint() y TableStoreInputFormat.setCredential() para especificar el endpoint y la información de AccessKey requerida para acceder a Tablestore.

    • Especifique una tabla para contar.

    Nota
    • Cada vez que invoca addCriteria(), se agrega un objeto RangeRowQueryCriteria definido por el SDK de Java al origen de datos. Puede invocar addCriteria() varias veces. El objeto RangeRowQueryCriteria está sujeto a los mismos límites que el objeto RangeRowQueryCriteria usado por la operación GetRange del SDK de Java de Tablestore.

    • Use setFilter() y addColumnsToGet() de RangeRowQueryCriteria para filtrar filas y columnas innecesarias en el servidor de Tablestore. Esto reduce la cantidad de datos consultados, disminuye costos y mejora el rendimiento.

    • Para realizar una operación de unión en varias tablas, agregue varios objetos RangeRowQueryCriteria correspondientes a dichas tablas.

    • Para dividir los datos de manera más uniforme, agregue varios objetos RangeRowQueryCriteria para la misma tabla. El conector Tablestore-Hadoop divide el rango especificado en rangos más pequeños según políticas específicas.

Ejemplo de ejecución del programa

  1. Establezca HADOOP_CLASSPATH.

    HADOOP_CLASSPATH=hadoop-connector.jar bin/hadoop jar row-counter.jar
  2. Ejecute el comando find output -type f para buscar todos los archivos en el directorio de salida.

    El comando devuelve el siguiente resultado:

    output/_SUCCESS
    output/part-r-00000
    output/._SUCCESS.crc
    output/.part-r-00000.crc
  3. Ejecute el comando cat output/part-r-00000 para ver el número de filas en el resultado de la ejecución.

    TOTAL   9

Notas sobre conversión de tipos

Los tipos de datos que admite Tablestore no son exactamente iguales a los que admiten Hive o Spark.

A continuación se describe la compatibilidad de conversión de tipos de datos de Tablestore (filas) a tipos de datos de Hive o Spark (columnas).

Conversión de tipos

TINYINT

SMALLINT

INT

BIGINT

FLOAT

DOUBLE

BOOLEAN

STRING

BINARY

INTEGER

Compatible, con pérdida de precisión

Compatible, con pérdida de precisión

Compatible, con pérdida de precisión

Compatible

Compatible, con pérdida de precisión

Compatible, con pérdida de precisión

No compatible

No compatible

No compatible

DOUBLE

Compatible, con pérdida de precisión

Compatible, con pérdida de precisión

Compatible, con pérdida de precisión

Compatible, con pérdida de precisión

Compatible, con pérdida de precisión

Compatible

No compatible

No compatible

No compatible

BOOLEAN

No compatible

No compatible

No compatible

No compatible

No compatible

No compatible

Compatible

No compatible

No compatible

STRING

No compatible

No compatible

No compatible

No compatible

No compatible

No compatible

No compatible

Compatible

No compatible

BINARY

No compatible

No compatible

No compatible

No compatible

No compatible

No compatible

No compatible

No compatible

Compatible