Hive UDF para selecionar todas, exceto algumas colunas
O padrão de criação de consulta comum no HiveQL (e SQL em geral) é selecionar todas as colunas (SELECT *
) ou um conjunto de colunas explicitamente especificado (SELECT A, B, C
) O SQL não possui mecanismo interno para selecionar todas, exceto um conjunto especificado de colunas.
Existem vários mecanismos para excluir algumas colunas, conforme descrito emesta pergunta SO mas nenhum se aplica naturalmente ao HiveQL. (Por exemplo, a ideia de criar uma tabela temporária comSELECT *
entãoALTER TABLE DROP
algumas de suas colunas causariam estragos em um ambiente de big data.)
Ignorando a discussão ideológica sobre se é uma boa ideia selecionar todas, exceto algumas colunas, esta pergunta é sobre as possíveis maneiras de estender o Hive com esse recurso.
Antes do Hive 0.13.0, o SELECT podia usar colunas baseadas em expressões regulares, por exemplo,property_.*
dentro de uma string citada por backtick. A resposta da @ invoketheshell abaixo refere-se a esse recurso, mas tem um custo, ou seja, quando esse recurso está ativado, o Hive não pode aceitar colunas com caracteres não padrão, por exemplo,$foo
oux/y
. É por isso que os desenvolvedores do Hive desativaram esse comportamento por padrão na 0.13.0. Estou procurando uma solução genérica que funcione para qualquer nome de coluna.
Um UDF genérico de geração de tabela (UDTF) certamente poderia fazer isso porque podemanipular o esquema. Como não vamos gerar novas linhas, existe uma maneira de resolver esse problema usando um UDF simples baseado em linhas?
Parece um problema comum, com muitas postagens na Web mostrando como resolvê-lo para vários bancos de dados, mas ainda não consegui encontrar uma solução para o Hive. Existe código em algum lugar que faz isso?