Saltar al contenido

Tabla externa de Hive Omitir primera fila

Después de de esta extensa búsqueda de información dimos con la respuesta esta preocupación que suelen tener algunos los lectores. Te regalamos la respuesta y nuestro deseo es resultarte de mucha ayuda.

Solución:

Las filas de encabezado en los datos son un dolor de cabeza perpetuo en Hive. Aparte de modificar la fuente de Hive, creo que no puede salirse con la suya sin un paso intermedio. (Editar: Esto ya no es true, vea la actualización a continuación)

Desafortunadamente, eso responde a tu pregunta. Lanzaré algunas ideas para el paso intermedio para completar.

Puede salirse sin un paso adicional en su carga de datos si está dispuesto a filtrar la fila del encabezado en cada consulta que toca la tabla. Desafortunadamente, esto agrega un conjunto adicional en casi todos los demás lugares. Y tendrá que ser inteligente/desordenado cuando la fila del encabezado viole su esquema. Si opta por este enfoque, podría considerar escribir un SerDe personalizado que haga que esta fila sea más fácil de filtrar. Desafortunadamente, SerDe no puede eliminar la fila por completo (o eso podría formar una posible solución), deben devolver algo como null. Nunca he visto este enfoque en la práctica para lidiar con las filas de encabezado, ya que hace que la lectura sea un problema, y ​​la lectura tiende a ser mucho más común que la escritura. Puede tener un lugar si se trata de una de las tablas o si la fila del encabezado es solo una fila entre muchas filas con formato incorrecto.

Puede hacer este filtrado una vez con variaciones en la eliminación de esa primera fila en la carga de datos. A WHERE cláusula en un INSERT declaración lo haría. Podrías usar utilidades como sed deshacerse de eso. He visto ambos enfoques tomados. Hay compensaciones entre el enfoque que tomas y ninguno lo es. true forma de lidiar con las filas de encabezado. Desafortunadamente, ambos enfoques toman tiempo y requieren una duplicación temporal de los datos. Si necesita absolutamente la fila de encabezado para otra aplicación, la duplicación sería permanente.

Actualizar:

Desde Hive v0.13.0, puede usar skip.header.line.count. También puede especificar lo mismo al crear la tabla. Por ejemplo:

create external table testtable (name string, message string)
row format delimited 
fields terminated by 't' 
lines terminated by 'n' 
location '/testtable'
tblproperties ("skip.header.line.count"="1");

Si bien tiene su respuesta de Daniel, aquí hay algunas personalizaciones posibles usando OpenCSVSerde:

CREATE EXTERNAL TABLE `mydb`.`mytable`(
    `product_name` string,
    `brand_id` string,
    `brand` string,
    `color` string,
    `description` string,
    `sale_price` string)
PARTITIONED BY (
    `seller_id` string)
ROW FORMAT SERDE
    'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
    'separatorChar' = 't',
    'quoteChar' = '"',
    'escapeChar' = '\')
STORED AS INPUTFORMAT
    'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
    'hdfs://namenode.com:port/data/mydb/mytable'
TBLPROPERTIES (
    'serialization.null.format' = '',
    'skip.header.line.count' = '1')

Con esto, tienes control total sobre el separador, el carácter de comillas, el carácter de escape, null manejo y manejo de encabezados.

Mira aquí y aquí.

Simplemente agregue debajo de la propiedad en su consulta y el primer encabezado o línea en el registro no se cargará o se omitirá.

Prueba esto

tblproperties ("skip.header.line.count"="1");

Reseñas y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *