Colmena UDF para seleccionar todo excepto algunas columnas
El patrón común de creación de consultas en HiveQL (y SQL en general) es seleccionar todas las columnas (SELECT *
) o un conjunto de columnas explícitamente especificado (SELECT A, B, C
) SQL no tiene un mecanismo incorporado para seleccionar todos excepto un conjunto específico de columnas.
Existen varios mecanismos para excluir algunas columnas como se describe enesta pregunta SO pero ninguno se aplica naturalmente a HiveQL. (Por ejemplo, la idea de crear una tabla temporal conSELECT *
entoncesALTER TABLE DROP
algunas de sus columnas causarían estragos en un entorno de big data).
Ignorando la discusión ideológica sobre si es una buena idea seleccionar todas menos algunas columnas, esta pregunta trata sobre las posibles formas de extender Hive con esta capacidad.
Antes de Hive 0.13.0 SELECT podría tomar columnas basadas en expresiones regulares, por ejemplo,property_.*
dentro de una cadena entre comillas. La respuesta de @ invoketheshell a continuación se refiere a esta capacidad, pero tiene un costo, que es que, cuando esta capacidad está activada, Hive no puede aceptar columnas con caracteres no estándar, por ejemplo,$foo
ox/y
. Es por eso que los desarrolladores de Hive desactivaron este comportamiento por defecto en 0.13.0. Estoy buscando una solución genérica que funcione para cualquier nombre de columna.
Una tabla genérica UDF que genera (UDTF) ciertamente podría hacer esto porque puedemanipular el esquema. Dado que no vamos a generar nuevas filas, ¿hay alguna manera de resolver este problema utilizando un simple UDF basado en filas?
Esto parece un problema común con muchas publicaciones en la Web que muestran cómo resolverlo para varias bases de datos, pero no he podido encontrar una solución para Hive. ¿Hay algún código en algún lugar que haga esto?