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.
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
-
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 -
Ejecute el comando
bin/hivepara 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ón Descripció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), especifiquetablestore.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.NotaLos 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 detablestore.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.
-
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()yTableStoreInputFormat.setCredential()para especificar el endpoint y la información de AccessKey requerida para acceder a Tablestore.Especifique una tabla para contar.
NotaCada 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
-
Establezca HADOOP_CLASSPATH.
HADOOP_CLASSPATH=hadoop-connector.jar bin/hadoop jar row-counter.jar -
Ejecute el comando
find output -type fpara 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 -
Ejecute el comando
cat output/part-r-00000para 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 |