tutorial summoners spark pig com2us hadoop hive

hadoop - spark - hive summoners war



Carga de datos de tabla de colmena con SerDE predeterminado (2)

El servicio de texto predeterminado en Hive (LazySimple) no es compatible con la semántica de CSV adecuada. La buena noticia es que en la última versión de colmena hasta la fecha - 0.14.0 - hay un nuevo servidor que se encarga de eso exactamente. Si usa esta versión, puede usar el seridor CSV y especificar una comilla doble como carácter de comillas, lo que lleva a un análisis correcto de los datos, como lo especifica en su pregunta.

Información sobre el servicio y cómo usarlo: https://cwiki.apache.org/confluence/display/Hive/CSV+Serde

Los datos están en el siguiente formato

a B C D e

p, q, "e, r", t

a, s, "t, g", t

Yo quería crear una tabla Hive

Col1, Col2, Col3, Col4

a B C D e

p, q, e, r, t

a, s, t, g, t

Como se ve arriba, si los datos están encapsulados entre comillas dobles, la coma entre ellos no se debe considerar al crear los datos de la tabla. Si uso el SerDe predeterminado, las comillas dobles se ignoran yb, c se considera como dos columnas separadas.

¿Cómo me aseguro de que la comilla doble ignorará la coma entre dos elementos si está encapsulada en comillas dobles?


Si es posible y factible, primero recomiendo explorar para ver si los datos de entrada se pueden desinfectar de tal manera que se pueda usar algo además de las comas para los delimitadores de campo. Siempre es arriesgado usar un patrón delimitador que puede ocurrir naturalmente en sus datos.

Pero si eso no es posible, existe esta forma regular basada en la expresión para detectar comas cotizadas:

  1. Primero ingrese sus datos en una tabla de etapas como filas de columna única (la línea completa en cada fila).
  2. Detecta las comas que se producen entre comillas y reemplázalos con un marcador de posición artificial.
  3. Divida la cadena resultante usando comas como delimitadores.
  4. Reemplace los marcadores de posición artificiales con las comas que representaron originalmente.

Como un ejemplo concreto ideado, cargué la siguiente tabla de etapas de una columna con sus datos (paso # 1):

hive> DESCRIBE staging; OK rawline string Time taken: 0.238 seconds, Fetched: 1 row(s) hive> SELECT * FROM staging; OK a,"b,c",d, e p,q,"e,r", t a,s,"t,g", t Time taken: 0.277 seconds, Fetched: 3 row(s)

La siguiente consulta genera la tabla final de objetivos.

DROP TABLE IF EXISTS test; CREATE TABLE test ( Col1 STRING, Col2 STRING, Col3 STRING, Col4 STRING ); INSERT INTO TABLE test SELECT regexp_replace(fields[0], "//[QUOTEDCOMMA//]", ","), -- Step #4 regexp_replace(fields[1], "//[QUOTEDCOMMA//]", ","), -- Step #4 regexp_replace(fields[2], "//[QUOTEDCOMMA//]", ","), -- Step #4 regexp_replace(fields[3], "//[QUOTEDCOMMA//]", ",") -- Step #4 FROM ( SELECT split( -- Step #2 and #3 regexp_replace(rawline, "/"([^,]*),([^,]*)/"", "$1[QUOTEDCOMMA]$2"), '','') AS fields FROM staging ) t;

Esto genera la siguiente test mesa final:

hive> SELECT * FROM test; OK a b,c d e p q e,r t a s t,g t Time taken: 0.196 seconds, Fetched: 3 row(s)

En esta implementación de muestra, la cadena [QUOTEDCOMMA] se está utilizando como el marcador de posición artificial para una coma que se encuentra entre comillas. La elección fue completamente arbitraria y, en la práctica, si realiza esta ruta, querrá asegurarse de que su marcador de posición no se produzca de forma natural en sus datos.