Creación de un almacén de datos desde 0 (2): ¿Cómo "juega" un gerente de producto con Hive SQL

Sobre el Autor

Lianshi East Road @ 乌森

Donde está el corazón, la mierda crece. Desde la arquitectura subyacente hasta la aplicación real, hablemos de la historia detrás de convertir los números en oro.

Continúe actualizando la serie de artículos sobre gobernanza de datos, ciencia de datos, visualización de datos y computación espacial.

01 Prefacio

Debido a las necesidades comerciales, Xiaomei, la gerente de productos de la empresa recién contratada, desea configurar una pantalla de datos grandes para ver los datos por sí misma. Ella le pidió al desarrollador Xiao Wang que solicitara el permiso del almacén de datos, y luego encontró una herramienta para la pantalla de big data en el centro técnico y movió el SQL que usaba para verificar los datos para ejecutar, pero siempre informaba un error.

Creación de un almacén de datos desde 0 (2): ¿Cómo "juega" un gerente de producto con Hive SQL
Xiaomei encontró al hermano mayor Xiaoshuai, que era gerente de productos de datos, y echó un vistazo.
Xiaoshuai: Hay un problema con su consulta y el sql del sistema empresarial no se puede utilizar directamente.
Xiaomei: Creo que se ve casi igual. Excepto por una partición adicional, ¿no es todo SQL?
Xiaoshuai: Lo que está creando es una consulta de Hive. Aunque Hive SQL es muy similar a SQL, existen diferencias en algunos detalles.

02 ¿Qué es Hive SQL?

Hive es un componente de almacenamiento de datos de uso común en el campo de big data. Puede usar el lenguaje de consulta SQl para mapear los archivos estructurados almacenados en HDFS en una tabla de base de datos y proporcionar funciones de consulta similares a SQL. Hive-SQL es esta "función de consulta similar a SQL". Hive-SQL es básicamente lo mismo que SQL, porque el propósito del diseño original era permitir que aquellos que conocen SQL y no pueden programar MapReduce completen el trabajo de procesamiento de datos.
[Extensión] ¿Cómo se transforma Hive-SQL en tareas de MapReduce? Todo el proceso de compilación se divide en seis etapas:

1) Antlr define las reglas gramaticales de SQL, completa el análisis léxico y gramatical de SQL y convierte SQL en árbol de sintaxis abstracta. Árbol AST
2) Atraviesa el árbol AST, abstrae la unidad constituyente básica de la consulta QueryBlock
3) Atraviesa QueryBlock, lo traduce a un árbol de operadores
4) El optimizador de capa lógica realiza la transformación OperatorTree, fusiona ReduceSinkOperator innecesario y reduce la cantidad de datos aleatorios.5
) Atraviesa OperatorTree y lo traduce en tareas de MapReduce.6
) El optimizador de capa física realiza la transformación de tareas MapReduce para generar el plan de ejecución final.

Aquí hay una breve introducción a algunas de las partes clave:
Antlr: Antlr es una herramienta de reconocimiento de lenguaje utilizada para implementar análisis léxico y gramatical SQL, y procesos completos que incluyen análisis léxico, análisis gramatical, análisis semántico y generación de código intermedio. Solo necesita escribir el archivo gramatical correspondiente y definir las reglas de reemplazo léxico y gramatical.
Árbol de sintaxis abstracta Árbol AST: después del análisis léxico y gramatical, el árbol de sintaxis abstracta de Antlr se utiliza para convertir la oración de entrada en un árbol de sintaxis abstracta para su posterior procesamiento.
QueryBlock: AST Tree es todavía muy complejo y no está lo suficientemente estructurado como para traducirlo directamente a programas MapReduce.Convertir AST Tree en QueryBlock es abstraer y estructurar aún más SQL. QueryBlock es la unidad más básica de SQL, que incluye tres partes: fuente de entrada, proceso de cálculo y salida. En pocas palabras, un QueryBlock es una subconsulta. Cuando miramos el registro de consultas de HiveSQL, veremos un bloque de proceso, que es el QueryBlock dividido.

Creación de un almacén de datos desde 0 (2): ¿Cómo "juega" un gerente de producto con Hive SQL

03 Sintaxis básica de Hive SQL

La cláusula HAVING se usa en la consulta de Xiaomei. No es compatible con Hive y se puede reemplazar por una subconsulta. Luego Xiaoshuai explicó la sintaxis básica de HiveSQL para Xiaomei.

Comandos de visualización de uso común

mostrar bases de datos; - ver qué bibliotecas están disponibles
mostrar tablas; - ver qué tablas están debajo de la biblioteca actual
mostrar particiones; - ver particiones
mostrar funciones; - enumerar todas las funciones
describir table_name extendido; - ver la estructura y los campos de la tabla,
Operaciones de base de datos y tablas de uso común en particiones y otras situaciones

crear el nombre de la base de datos;
-crear una base de datos crear una tabla [externa] [si no existe] table_name-crear una tabla, especificar el nombre de la tabla. external indica si la tabla creada es una tabla externa o no, es una tabla interna. si no existe significa que la tabla se crea cuando la tabla no existe; de ​​lo contrario, se ignora la excepción.
[(Col_name data_type [comment col_comment], ...)] - Crear campo, especificar el tipo de campo, comentar
[comment table_comment] - Comentar en la tabla
[particionado por (col_name data_type [comment col_comment], col_name_2 data_type_2, ...)] - Especifique la partición, preste atención a los campos de la tabla que no pueden aparecer en el campo de la partición
[agrupados por (col_name, col_name_2, ...)] [ordenados por (col_name [ASC | DESC], ... )] en num_buckets buckets] -buckets
[formato de fila row_format]
[almacenado como file_format] -especifica el tipo de archivo de almacenamiento. Archivo de texto de datos de texto sin formato, secuencia de datos comprimidos (ahorra espacio de almacenamiento).
[Location hdfs_path] - ruta de almacenamiento
crear tabla table_name como old_table_name; - usar como palabra clave para copiar la estructura de la tabla
Modificar tabla table_name renombrar a new_table_name; - Cambiar el nombre de la tabla
modificar tabla table_name agregar columnas (col_name data_type comment'col_comment '); - Agregar un campo y agregar un comentario
modificar tabla table_name reemplazar columnas (col_name data_type, col_name_2 data_type_2); - Eliminar columna
modificar tabla nombre_tabla agregar [si no existe] nombre_partición; - Agregar partición
modificar tabla nombre_tabla soltar nombre_partición, nombre_partición_2; - Eliminar
operaciones de datos comunes de partición

insertar en tabla_1 seleccionar de tabla_2; - agregar datos después de tabla_1
insertar sobrescribir tabla_1 seleccionar
de tabla_2; - primero vaciar los datos en tabla_1, y luego agregar datos
operaciones de consulta comunes

La estructura de consulta de HiveSQL es la misma que la de SQL. Además de la cláusula HAVING mencionada anteriormente, debe tenerse en cuenta que no hay ningún nulo en HiveSQL. Cuando el campo es nulo, use \ n en su lugar.

04 funciones de uso común de Hive SQL

Hay dos errores de llamada de función en la consulta de Xiaomei:
1) Se usa la función GROUP_CONCAT (), que no está en HiveSQL, pero puede ser reemplazada por la función CONCAT_WS ();
2) Es la función substring_index (), esta debe ser reemplazada por split () función.
Luego Xiaoshuai habló sobre las funciones de uso común en Hive para Xiaomei.
Función matemática

bin (int d) - calcula el valor de cadena del valor binario d
rand (int semilla) - devuelve un número aleatorio, la semilla es el factor aleatorio
round (doble d, int n) - devuelve el valor aproximado de d con n decimales
piso ( doble d): devuelve el valor entero más grande menor que d
ceil (doble d): devuelve la función de
fecha entera más pequeña mayor que d

current_date (): devuelve la fecha actual
unix_timestamp (): devuelve la marca de tiempo Unix de la hora actual o especifica una fecha específica. Como unix_timestamp ('2021-01-13', 'aaaa-mm-dd') = 1610513364
from_unixtime (): devuelve la fecha de la marca de tiempo de Unix. Como selectfrom_unixtime (unix_timestamp ('2021-01-13', 'aaaa-mm-dd'), 'aaaammdd') = '20210113' to_date
(string timestamp) - devuelve la parte de la fecha de la cadena de tiempo, como to_date (' 2021-01-0100: 00: 00 ') =' 2021-01-01 '
año (fecha) - Devuelve el año de la fecha fecha, como año (' 2021-01-01 ') = 2021
mes (fecha) - Devuelve el mes de la fecha fecha, como mes ('2021-01-01') = 1
día (fecha) - Devuelve el día de la fecha fecha, como día ('2021-01-01') = 1
semana del año (fecha) - La fecha de devolución se encuentra en las primeras semanas del año, como weekofyear ('2021-01-01') = 1
dateiff (date1, date2): devuelve el número de días entre date1 y date2, como dateiff ('2021-01-01' , '2021-01-02'

date_sub (date, int1) - devuelve la fecha date menos int1, como date_sub ('2021-01-03', 2) = '2021-01-01' months_between
(date1, date2) - devuelve date1 y date2 La diferencia de mes, como months_between ('2021-03-01', '2021-01-01') = 2
add_months (date, int1) - devuelve la fecha de la fecha más int1 meses, int1 puede ser un número negativo. Como add_months ('2021-02-01', -1) = '2021-01-01'
last_day (fecha): devuelve el último día del mes en el que se encuentra la fecha. Por ejemplo, last_day ('2021-01-01') = '2021-01-31'
next_day (fecha, día1): devuelve la fecha de la siguiente semana day1 después de la fecha. day1 son las dos primeras letras de la semana X, como next_day ('2021-01-013', 'MO') devuelve '2021-01-18'
trunc (date, string1) - devuelve el primer día o ubicación del mes donde está la fecha El primer día del año. String1 puede ser el año (AAAA / AAAA / AÑO) o el mes (MES / MES / MM). Como trunc ('2021-01-13', 'MM') = '2021-01-01', trunc ('2021-02-01', 'YYYY') =
función de cadena '2021-01-01'

length (cadena) - devuelve la longitud de la cadena
concat (cadena1, cadena2) - devuelve la cadena concatenada cadena1 y cadena2
concat_ws (sep, cadena1, cadena2) - devuelve la cadena concatenada de acuerdo con el separador especificado sep
lower ( cadena): devuelve una cadena en minúsculas, igual que lcase (cadena).
upper (cadena): devuelve una cadena en mayúsculas, igual que ucase (cadena).
ascii (cadena): devuelve el valor ascii del primer carácter de la cadena.
space (int1): devuelve una cadena de espacio de longitud int1.
trim (cadena): elimina los espacios a la izquierda y a la derecha de la cadena.
ltrim (cadena): elimina el espacio izquierdo de la cadena.
rtrim (cadena): elimina el espacio derecho de la cadena.
repeat (string, int1): devuelve la cadena después de repetir la cadena int1 veces.
reverse (cadena): devuelve la cadena de cadena invertida. Por ejemplo, reverse ('abc') = 'cba'
lpad (string, len1, pad1) --- llene la cadena con los caracteres pad1 a la izquierda de len1. Como rpad ('abc', 5, '1') = '11abc'.
rpad (string, len1, pad1): complete la cadena con caracteres pad1 a la derecha de len1. Como rpad ('abc', 5, '1') = 'abc11'.
split (string, pat1): divide la cadena con regularidad pat1 y devuelve una matriz. Como split ('a, b, c', ',') = ["a", "b", "c"]
substr (string, index1, int1) - intercepta los caracteres int1 desde la posición del índice. Como substr ('abcde', 1,2) = 'ab'
regexp_replace (string1, string2, string4 ) -Función de reemplazo de expresión regular. Reemplace la expresión regular string2 en string1 con string3. Como regexp_replace ('abcde,' b | c | d ', ”) =
función agregada ' ae '

count (col) - cuenta el número de filas
sum (col) - cuenta la columna especificada y
avg (col) - cuenta el valor promedio de la columna especificada
min (col) - devuelve el valor mínimo de la columna especificada
max (col) - devuelve la columna especificada
Función de ventana máxima

row_number () over (partición por .. ordenar por ..) - ordenar según la partición, el mismo valor toma diferentes números de secuencia, no hay número de secuencia saltar
rango () sobre (partición por .. ordenar por ..) - ordenar según la partición, El mismo valor toma el mismo número de secuencia, hay un número de secuencia jump
dense_rank () over (particionar por .. ordenar por ..) - De acuerdo con el orden de partición, el mismo valor toma el mismo número de secuencia, y no hay un número de secuencia jump
lag (col, n) over (particionar por ..)
.ordenar por ..) --Ver la enésima línea superior de la línea actual adelantar (col, n) sobre (dividir por .. ordenar por ..) --Ver la
función de conversión de la enésima línea inferior de la línea actual

cast (col como dtype) -Convierte el valor especificado al tipo de datos especificado dtype, como la
función de juicio de conversión de cadena a entero

NVL (expr1, expr2): si el primer parámetro está vacío, se mostrará el segundo parámetro; de lo contrario, se mostrará el primer parámetro. Se usa comúnmente para juicios no vacíos, como nvl (table1.name, '') <> ''
NVL2 (expr1, expr2, expr3) - Si el primer parámetro está vacío, se mostrará el segundo parámetro; de lo contrario, se mostrará el tercer parámetro Parámetro
NULLIF (expr1, expr2) - Si el primer parámetro es igual al segundo parámetro, devuelve NULL (NULL), de lo contrario devuelve el primer parámetro
Coalesce (expr1, expr2, expr3… .exprn) - Devuelve la secuencia del parámetro El primer parámetro no vacío

Funciones analíticas

regexp_extract (string1, string pattern, int1) -Función de análisis de expresión regular. Divida string1 de acuerdo con las reglas del patrón de expresión regular y devuelva el carácter especificado por int1. Tales como regexp_extract ('foothebar', 'foo (. ?) (Bar)', 1) = 'the', regexp_extract ('foothebar', 'foo (. ?) (Bar)', 2) = 'bar'
Size ( map (<clave, valor>, <clave, valor>)): devuelve el número de colecciones de mapas. Por ejemplo, size (map (1, 'a', 2, 'b')) = 2.
find_in_set (string1, string strList): devuelve la posición de la primera aparición de string1 en strlist, strlist es una cadena (conjunto) separada por comas. Si no se encuentra
string1 , devuelve 0. parse_url (string url_string, stringpartToExtract [, string keyToExtract]) - función de análisis de url, valores válidos de partToExtract: HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE y USERINFO. Como parse_url (' http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1′,'HOST')='facebook.com ', parse_url (' http://facebook.com/path1 /p.php?k1=v1
& k2 = v2 # Ref1 ′, 'CONSULTA', 'k1') = 'v1'
get_json_object (string json_string, string path) - función de análisis de json. Analice la cadena json json_string y devuelva el contenido especificado por la ruta. Si la cadena json de entrada no es válida, se devuelve NULL.

Conversión de rango

concat_ws (sep, collect_set (col1)): convierte varias líneas en una columna, separadas por un separador de sep. Collect_set también se puede reemplazar por collect_list () cuando no hay duplicación. Collect_set () elimina los duplicados, collect_list () no elimina los duplicados
Vista lateral explotar (dividir (col1, sep)) - Una columna a varias filas.

05 Posdata

Xiaomei lo intentó ella misma basándose en las notas que tomó y finalmente completó la construcción de la pantalla de datos grandes.

El lugar privado de una persona de datos es una gran familia que ayuda a la persona de datos a crecer, ayudando a los socios interesados ​​en los datos a aclarar la dirección del aprendizaje y mejorar sus habilidades con precisión. Sígueme y llévate a explorar los misterios mágicos de los datos.

1. Vuelva a "Productos de datos" y obtenga <Preguntas de entrevista para productos de datos de Big Factory>

2. Vuelva a "Centro de datos" y obtenga <Información del centro de datos de Dachang>

3. Vuelva a "Análisis de negocio" y obtenga <Preguntas de la entrevista de análisis de negocio de Dachang>;

4. Vuelva a "hacer amigos", únase al grupo de intercambio y conozca más socios de datos.

Supongo que te gusta

Origin blog.51cto.com/13526224/2591080
Recomendado
Clasificación