La API SelectObject le permite ejecutar instrucciones SQL en objetos y recuperar los resultados.
Contexto
Hadoop 3.0 admite la ejecución de servicios como Spark, Hive y Presto en E-MapReduce (EMR) para procesar datos almacenados en Object Storage Service (OSS). Otros servicios de Alibaba Cloud, como MaxCompute y Data Lake Analytics (DLA), también permiten procesar datos directamente desde OSS.
Tradicionalmente, las plataformas de big data usan la API GetObject para descargar objetos completos desde OSS antes de filtrarlos y analizarlos.
La API SelectObject resuelve este problema al delegar la lógica de consulta, como proyecciones y filtros, a la capa de OSS. Así se recupera únicamente el subconjunto de datos necesario, lo que reduce la transferencia de información, disminuye los costos y ahorra CPU y memoria en el cliente. Esta eficiencia hace que el análisis de datos en OSS resulte mucho más atractivo.
Facturación
Cuando utiliza la API SelectObject para consultar datos, se le cobra según la cantidad real de datos analizados del objeto de origen. Para obtener más información, consulte Data processing fees.
Formatos de objeto compatibles
La API SelectObject admite formatos de objeto y sintaxis SQL específicos.
Objetos CSV que cumplen con RFC 4180. Esto incluye objetos similares a CSV, como TSV. Es posible especificar delimitadores de fila, delimitadores de columna y caracteres de comillas personalizados.
-
Objetos JSON codificados en UTF-8. Se admiten dos formatos: DOCUMENT y LINES.
DOCUMENT: todo el objeto constituye un único objeto JSON válido.
LINES: el objeto consta de varias líneas, donde cada una es un objeto JSON independiente. Las líneas se separan mediante un carácter de nueva línea, como \n o \r\n. No es necesario especificar el delimitador; sin embargo, el objeto completo no representa un objeto JSON válido.
Objetos en las clases de almacenamiento Standard e Infrequent Access. Los objetos de las clases Archive, Cold Archive o Deep Cold Archive deben restaurarse antes de consultarlos.
Objetos cifrados mediante cifrado del lado del servidor con claves administradas por OSS o con una CMK administrada por KMS.
Sintaxis SQL compatible
Cláusulas SQL: SELECT, FROM, WHERE
Tipos de datos: string, int (64 bits), double (64 bits), decimal (128 bits), timestamp y bool
-
Operadores: lógicos (AND, OR, NOT), aritméticos (+, -, *, /, %), de comparación (>, =, <, >=, <=, !=) y de cadena (LIKE, ||)
ImportanteEl operador LIKE realiza coincidencias de patrones con distinción entre mayúsculas y minúsculas.
Tipos de datos compatibles
De forma predeterminada, todos los datos de un objeto CSV se tratan como cadenas. Utilice la función CAST para realizar conversiones de tipo explícitas.
A continuación se muestra cómo usar una consulta SQL para convertir los valores de las columnas _1 y _2 a enteros:Select * from OSSOBject where cast (_1 as int) > cast(_2 as int)
La API SelectObject también admite la conversión implícita de tipos en una cláusula WHERE. Por ejemplo, en la siguiente instrucción, los valores de la primera y segunda columna se convierten implícitamente a enteros:
Select _1 from ossobject where _1 + _2 > 100
En los objetos JSON, si no utiliza la función CAST, el tipo de dato se determina según el contenido del objeto. Los tipos de datos JSON integrados estándar incluyen null, bool, int64, double y string.
Ejemplos de SQL
Esta sección proporciona ejemplos de SQL para objetos CSV y JSON.
-
CSV
Caso de uso
Instrucción SQL
Devuelve las primeras 10 filas de datos.
select * from ossobject limit 10
Devuelve los enteros de la primera y tercera columna cuando el valor de la primera columna es mayor que el de la tercera.
select _1, _3 from ossobject where cast(_1 as int) > cast(_3 as int)
Devuelve el recuento de registros de la primera columna que comienzan con 'Chen'. (Nota: el carácter chino después de 'like' debe estar codificado en UTF-8).
select count(*) from ossobject where _1 like 'Chen%'
Devuelve todos los registros cuya marca de tiempo en la segunda columna sea posterior a 2018-08-09 11:30:25 y cuyo valor en la tercera columna supere 200.
select * from ossobject where _2 > cast('2018-08-09 11:30:25' as timestamp) and _3 > 200
Calcula el promedio, la suma, el máximo y el mínimo de los números de punto flotante en la segunda columna.
select AVG(cast(_6 as double)), SUM(cast(_6 as double)), MAX(cast(_6 as double)), MIN(cast(_6 as double)) from ossobject
Devuelve todos los registros donde la cadena concatenada de la primera y tercera columna comienza con 'Tom' y termina con 'Anderson'.
select * from ossobject where (_1
_3) like 'Tom%Anderson'
Devuelve todos los registros cuyo valor en la primera columna sea divisible entre 3.
select * from ossobject where (_1 % 3) = 0
Devuelve todos los registros cuyo valor en la primera columna esté entre 1995 y 2012.
select * from ossobject where _1 between 1995 and 2012
Devuelve todos los registros cuyo valor en la quinta columna sea 'N', 'M', 'G' o 'L'.
select * from ossobject where _5 in ('N', 'M', 'G', 'L')
Devuelve todos los registros donde el producto de los valores de la segunda y tercera columna sea mayor que la suma de 100 y el valor de la quinta columna.
select from ossobject where _2 _3 > _5 + 100
-
JSON
Suponga que tiene el siguiente objeto JSON:
{ "contacts":[ { "firstName": "John", "lastName": "Smith", "isAlive": true, "age": 27, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100" }, "phoneNumbers": [ { "type": "home", "number": "212 555-1234" }, { "type": "office", "number": "646 555-4567" }, { "type": "mobile", "number": "123 456-7890" } ], "children": [], "spouse": null },... # Additional contact nodes omitted for brevity. ]}La siguiente tabla muestra ejemplos de SQL.
Caso de uso
Instrucción SQL
Devuelve todos los registros donde el valor de age es 27.
select from ossobject.contacts[] s where s.age = 27
Devuelve todos los números telefónicos de casa.
select s.number from ossobject.contacts[].phoneNumbers[] s where s.type = "home"
Devuelve todos los registros donde spouse es null.
select * from ossobject s where s.spouse is null
Devuelve todos los registros sin hijos.
select * from ossobject s where s.children[0] is null
NotaNo existe una sintaxis específica para representar un arreglo vacío. Utilice la instrucción anterior en su lugar.
Casos de uso
Entre los casos de uso más comunes de SelectObject destacan la consulta paralela de objetos grandes, la consulta de objetos JSON y el análisis de archivos de registro.
-
Consultar objetos grandes en paralelo
Al igual que la función de descarga multiparte por rango de bytes de la API GetObject, la API SelectObject admite consultas paralelas. Puede dividir los datos de dos maneras:
Por fila: es un método habitual para dividir datos. Sin embargo, con datos dispersos, esta división puede generar una carga desequilibrada entre los workers de consulta.
Por split: un split es un concepto de OSS para la fragmentación de datos. Contiene varias filas y todos los splits tienen aproximadamente el mismo tamaño.
NotaDividir los datos por split resulta más eficiente que hacerlo por fila.
Si confirma que las columnas de su objeto CSV no contienen caracteres de nueva línea, la división por rango de bytes es más sencilla porque no requiere crear metadatos. Si las columnas incluyen caracteres de nueva línea o si consulta un objeto JSON, siga estos pasos:
Llame a la API CreateSelectObjectMeta para obtener el número total de splits del objeto. Para reducir el tiempo de análisis, se recomienda llamar a esta API de forma asíncrona antes de iniciar la consulta.
Determine el grado de paralelismo (n) según los recursos de su cliente. Luego, divida el número total de splits entre n para calcular cuántos splits debe procesar cada consulta paralela.
En el cuerpo de la solicitud, especifique el rango de splits que desea consultar, por ejemplo,
split-range=1-20.Combine los resultados de todas las consultas paralelas.
-
Consultar objetos JSON
Cuando consulte objetos JSON, limite la ruta JSON en la cláusula FROM para mejorar el rendimiento.
Considere el siguiente ejemplo de objeto JSON:
{ "contacts":[ { "firstName": "John", "lastName": "Smith", "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100" }, "phoneNumbers": [ { "type": "home", "number": "212 555-1234" }, { "type": "office", "number": "646 555-4567" }, { "type": "mobile", "number": "123 456-7890" } ] } ]}Para encontrar todas las direcciones donde el código postal comienza con '10021', puede escribir la instrucción SQL como
select s.address.streetAddress from ossobject.contacts[*] s where s.address.postalCode like '10021%'o bienselect s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%'.La segunda instrucción,
select s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%', ofrece un mejor rendimiento porque su ruta JSON es más precisa. -
Manejar números de punto flotante de alta precisión en objetos JSON
Cuando necesite realizar cálculos con números de punto flotante de alta precisión en un objeto JSON, se recomienda establecer la opción
ParseJsonNumberAsStringentruey luego convertir el valor al tipo decimal. Por ejemplo, si un atributoatiene el valor 123456789.123456789, utilice la instrucciónselect s.a from ossobject s where cast(s.a as decimal) > 123456789.12345para conservar la precisión de los datos originales.
Procedimiento
OSS console
OSS SDKs
ossutil CLI
Referencia de API
Las operaciones descritas anteriormente se basan en la API subyacente SelectObject. Si tiene requisitos avanzados, puede enviar solicitudes directas a la API REST. Cuando envíe solicitudes directas, deberá calcular manualmente la firma de autenticación. Para obtener más información, consulte SelectObject.
> Select Content