Red de conocimiento informático - Material del sitio web - Cómo usar números para obtener el valor de una columna en una tabla de colmena

Cómo usar números para obtener el valor de una columna en una tabla de colmena

La declaración de inserción de Hive puede obtener datos de la declaración de consulta y cargar los datos en la tabla de destino. Supongamos que existe una tabla staged_employees (tabla de volumen completo de información de los empleados), country cnty y state st son dos atributos de la tabla. Hagamos un experimento para consultar datos de esta tabla e insertarlos en otra tabla de empleados.

INSERTAR TABLA DE SOBRESCRITURA empleados

PARTICIÓN (país = 'China', estado = 'Beijing')

SELECT * FROM staged_employees se

WHERE se.st = 'Beijing';

Debido al uso de la palabra clave OVERWRITE, todos los datos en la misma partición original en la tabla de destino se sobrescribirán si no hay ninguna partición en la tabla de destino. , se sobrescribirá toda la tabla.

Si elimina la palabra clave OVERWRITE o la reemplaza con INTO, Hive agregará en lugar de reemplazar los datos en la partición o tabla original, una característica que se admite desde Hive v0.8.0.

Si los datos ya existen en hdfs, pero no están en el formato que queremos, si el cálculo debe realizarse en varios pasos y es necesario almacenar datos intermedios o si los datos originales; no está particionado y hay muchos no válidos. Si es necesario filtrar la columna, puede usar la sintaxis insertar... seleccionar para completar el proceso de conversión.

Dado que un país tiene muchas provincias, si desea dividir los datos según dos dimensiones (país, región), el número de ejecuciones de la instrucción SQL debe ser igual al número de regiones, por ejemplo. China tiene 23 provincias y la declaración SQL debe ejecutarse 23 veces. Por lo tanto, Hive modificó esta declaración SQL para escanear la tabla original solo una vez para producir diferentes resultados (múltiples salidas). Por ejemplo, la siguiente instrucción SQL escanea la tabla original solo una vez, pero genera datos de resultados para tres provincias al mismo tiempo:

FROM staged_employees se

INSERT OVERWRITE TABLE empleados

PARTICIÓN (país = 'China', estado = 'Provincia de Hebei')

SELECT * WHERE se.cnty = 'China' AND se.st = 'Provincia de Hebei'

INSERTAR TABLA DE SOBRESCRITURA empleados

PARTICIÓN (país = 'China', estado = 'Provincia de Shaanxi'

SELECT * WHERE SE.st = 'Provincia de Shaanxi'

INSERTAR TABLA DE SOBRESCRITURA empleados

PARTICIÓN (país = 'China', estado = 'Provincia de Henan')

SELECT * WHERE se.cnty = 'EE.UU.' AND se.st = 'Provincia de Henan';

Puede ver claramente a través de la sangría que escaneamos la tabla staged_employees una vez, pero ejecutamos 3 declaraciones INSERT diferentes. Este es el proceso de ejecución de esta gran declaración SQL: Primero, comenzamos desde. staged_employees Obtenga un registro de la tabla y luego ejecute cada cláusula de selección. Si la cláusula de selección pasa, ejecute la instrucción de inserción correspondiente.

Tenga en cuenta que estas tres cláusulas de selección se ejecutan de forma completamente independiente, en lugar de if...then...else, lo que significa que en algunos casos las tres cláusulas de selección se pueden ejecutar simultáneamente. Pase la prueba donde.

Con esta estructura, los datos de la tabla original se pueden dividir en diferentes particiones de la tabla de destino.

Si un registro en la tabla original satisface una de las cláusulas select... donde... dadas, entonces el registro se escribirá en una partición fija de la tabla de destino. De hecho, yendo un paso más allá, cada instrucción Insert puede escribir datos en una tabla de datos diferente, independientemente de si la tabla está particionada o no.

Entonces, al igual que un filtro, algunos de los datos de la tabla original se escribirán en muchas direcciones de salida, mientras que el resto de los datos se descartarán.

Por supuesto, también puedes combinar y usar Insertar, sobrescribir e insertar en estos dos métodos diferentes para escribir datos.

Insertar datos en la partición dinámica

Pero el problema aún no está resuelto. Hay 23 provincias en China, por lo que necesitamos escribir 23 cláusulas de inserción en . Es muy incómodo. Entonces, Hive tiene una función llamada partición dinámica, que puede inferir automáticamente los datos que se insertarán en la partición en función de los parámetros seleccionados. Las dos declaraciones SQL para configurar particiones en este artículo se denominan inserciones de particiones estáticas.

Después de modificar la declaración SQL anterior, obtendremos la siguiente declaración SQL nueva y concisa:

INSERT OVERWRITE TABLE empleados

PARTICIÓN (país, estado) p>

SELECT... , se.cnty, se.st

DESDE staged_employees se;

Seevo primero obtendrá los valores de se.cnty y parámetros se.st. cnty y se.st valores de los parámetros, y luego complete estos dos valores en la partición de la declaración Insertar en los dos países y las variables de estado en la partición de la declaración Insertar, es decir, la partición dinámica corresponde al valor de partición de ubicación. La relación entre el valor de la selección de tabla original y el valor de la partición de salida está determinada solo por la posición y no tiene nada que ver con el nombre. Por ejemplo, aquí se.county no tiene nada que ver con el nombre del condado.

La declaración SQL anterior establece dinámicamente dos particiones al mismo tiempo. Si hay 100 países en la tabla staged_employees y cada país tiene 100 regiones, entonces la declaración SQL creará automáticamente las particiones correspondientes para cada país y región e insertará datos, lo cual no es realista si se escribe manualmente.

Puedes combinar configuraciones de valores de partición dinámicas y estáticas siempre que la ubicación sea correcta, como en el siguiente ejemplo donde especificas estáticamente el valor del país pero usas un método dinámico para establecer el valor del estado:

INSERTAR TABLA DE SOBRESCRITURA empleados

PARTICIÓN (país = 'EE.UU.', estado)

SELECT .. , se.cnty, se.st

FROM staged_employees se

WHERE se.cnty = 'US';

Nota: ¡el valor de la partición estática debe preceder al valor de la partición dinámica!