Descrição
HiveText lê e grava o formato de serialização de texto usado pelas tabelas do Apache Hive
(o formato gerado pelo LazySimpleSerDe do Hive). É um formato de texto delimitado,
semelhante ao CSV, em que os campos são
separados pelo delimitador padrão do Hive \x01 (Ctrl-A). O delimitador de campos pode ser
configurado por meio de input_format_hive_text_fields_delimiter.
Quando usado como formato de entrada, os dados não têm linha de cabeçalho: os valores são
mapeados por posição para as colunas da tabela de destino, portanto os nomes e tipos das colunas
são obtidos da tabela (ou de uma estrutura fornecida
explicitamente), em vez de serem inferidos a partir dos dados. Durante a leitura, o ClickHouse analisa
datas e horas no modo best effort (consulte date_time_input_format),
preenche campos finais omitidos com os valores padrão das colunas e ignora campos que não
reconhece.
Dentro de um campo, os valores são analisados usando as mesmas regras de escape do CSV, em vez
dos delimitadores aninhados do Hive. Em particular, uma coluna do tipo
Array é lida a partir da representação
entre colchetes (por exemplo, "['a','b','c']"), e não de valores separados pelo
delimitador de coleção do Hive \x02.
As configurações de delimitadores aninhados não têm efeito na entradaAs configurações
input_format_hive_text_collection_items_delimiter e
input_format_hive_text_map_keys_delimiter são
aceitas por compatibilidade, mas atualmente não são usadas durante a análise. No entanto, elas são
usadas ao gravar valores aninhados na saída.input_format_hive_text_allow_variable_number_of_columns):
linhas com menos campos do que a tabela têm as colunas ausentes preenchidas com
valores padrão, e linhas com campos extras no final têm esses campos extras ignorados.
Exemplo de uso
,) usando
input_format_hive_text_fields_delimiter, para facilitar a leitura dos arquivos de entrada.
Leitura de um arquivo HiveText
hive_data.txt, com campos separados por vírgulas:
hive_data.txt
FORMAT HiveText:
Query
Response
1,3, tem apenas dois campos, então a coluna ausente c
é preenchida com o valor padrão 0.
Número variável de colunas
input_format_hive_text_allow_variable_number_of_columns = 1,
as linhas que têm mais campos do que a tabela simplesmente têm os campos
adicionais ao final ignorados:
hive_extras.txt
Query
Response
input_format_hive_text_allow_variable_number_of_columns = 0
impõe uma contagem estrita de campos, e uma linha com menos campos do que a tabela gera
uma exceção de análise.
Saída
HiveText grava cada linha sem delimitação:
os campos de nível superior são separados pelo delimitador de campos (\x01 por padrão), e
as linhas são separadas pelo delimitador de linhas (\n por padrão, configurável por meio de
format_hive_text_rows_delimiter). Os valores de tipos aninhados
(Array, Map
e Tuple) são gravados sem colchetes e
separados pelo separador do Hive correspondente ao nível de aninhamento, da mesma forma que o
LazySimpleSerDe do Hive. Os três primeiros separadores são o delimitador de campos configurável,
input_format_hive_text_collection_items_delimiter
(\x02 por padrão, usado para elementos de array, entradas de map e elementos de tupla) e
input_format_hive_text_map_keys_delimiter (\x03 por padrão,
usado entre uma chave de map e seu valor); níveis mais profundos usam, por padrão, caracteres de controle
consecutivos (\x04, \x05 e assim por diante, até oito níveis). Uma árvore de tipos aninhada
com profundidade suficiente para exigir um separador além desses oito níveis é rejeitada com uma
exceção NOT_IMPLEMENTED, pois o LazySimpleSerDe do Hive também não dispõe de separador para
isso. Tipos de dados que não têm uma representação textual natural no
Hive não têm suporte como saída e geram uma exceção
NOT_IMPLEMENTED. Isso inclui AggregateFunction, Dynamic,
Variant, LowCardinality e Object, bem como os tipos
numéricos Enum, Time, Time64 e Interval — o Hive não tem um tipo correspondente para estes
últimos, portanto eles são rejeitados em vez de serem gravados como seus
valores numéricos subjacentes brutos. Os tipos numéricos de maior largura Int128, UInt128, Int256 e UInt256
são rejeitados pelo mesmo motivo: o maior tipo inteiro do Hive é BIGINT (64 bits),
e nem mesmo o DECIMAL do Hive, com sua precisão máxima de 38, consegue comportar seu
intervalo de valores. Da mesma forma, valores Decimal com precisão acima de 38 (isto é,
Decimal256) excedem a precisão máxima de DECIMAL do Hive e são rejeitados.
Da mesma forma, as chaves de Map devem ser de um tipo primitivo: o Hive declara maps
como MAP<primitive_type, data_type>, portanto um Map cujo tipo de chave seja Array,
Map ou Tuple (o que o ClickHouse permite) é rejeitado com uma
exceção NOT_IMPLEMENTED, pois nenhum esquema do Hive poderia ler esses valores
novamente. O literal de map vazio map() é rejeitado pelo mesmo motivo: seu tipo
é Map(Nothing, Nothing), e Nothing não é um tipo que uma declaração
MAP<key_type, data_type> do Hive possa especificar. Todas essas verificações são aplicadas antecipadamente aos tipos de coluna declarados, antes que
qualquer linha seja gravada: uma consulta cujo cabeçalho contenha um tipo sem suporte em qualquer ponto
da árvore de tipos é rejeitada mesmo quando os valores reais nunca alcançariam a
serialização sem suporte (por exemplo, um Nullable de um tipo sem suporte
contendo apenas valores NULL, ou um Array/Map vazio de um tipo de elemento sem suporte),
pois o esquema declarado do arquivo ainda não poderia pertencer a nenhuma tabela do
Hive.
Date, Date32, DateTime e DateTime64 são sempre gravados no formato de texto simples de
data e timestamp do Hive (yyyy-MM-dd e yyyy-MM-dd HH:mm:ss[.fffffffff]),
independentemente da configuração date_time_output_format,
para que a saída permaneça analisável pelo Hive mesmo quando essa configuração for
unix_timestamp ou iso.
Pelo mesmo motivo, os valores Bool são sempre gravados como true/false,
independentemente das configurações bool_true_representation
e bool_false_representation,
e os valores NULL são sempre gravados como a sequência nula padrão do Hive,
\N, independentemente da configuração format_csv_null_representation.
Isso mantém a saída legível pelo LazySimpleSerDe do Hive, independentemente
dessas configurações genéricas de texto. De forma correspondente, o formato de entrada HiveText sempre
lê \N como NULL, também independentemente da
configuração format_csv_null_representation;
portanto, a ida e volta de escalares de nível superior não depende dela.
Valores não finitos de Float32 e Float64 são gravados usando as grafias Java do Hive
NaN, Infinity e -Infinity, em vez dos tokens usuais nan/inf/-inf do ClickHouse,
para que o analisador de FLOAT/DOUBLE do Hive os leia novamente como os mesmos valores,
em vez de NULL.
Saída compatível com o Hive, não um round-trip completo pelo formato de entradaA saída é destinada ao
LazySimpleSerDe padrão do Hive e não é simétrica ao
formato de entrada HiveText do próprio ClickHouse:- Valores aninhados de
Array,MapeTuplesão gravados com os separadores aninhados do Hive (sem colchetes), mas o formato de entrada analisa cada campo usando regras deCSV/colchetes e ignorainput_format_hive_text_collection_items_delimiter/input_format_hive_text_map_keys_delimiter. Portanto, uma saída aninhada comoSELECT [1, 2] FORMAT HiveTextnão é lida novamente porINSERT ... FORMAT HiveText— apenas campos escalares de nível superior fazem round-trip, e somente com o delimitador de linha\npadrão (consulte o próximo item). - O round-trip também exige o delimitador de linha
\npadrão. Quandoformat_hive_text_rows_delimiteré alterado, a saída separa as linhas usando o byte configurado, mas a entrada continua sendo baseada em nova linha noCSVRowInputFormat, e não há uminput_format_hive_text_rows_delimitercorrespondente. Portanto, uma saída escalar com várias linhas, comoSELECT number FROM numbers(3) FORMAT HiveText SETTINGS format_hive_text_rows_delimiter=';'(que produz0;1;2;), não é lida novamente porINSERT ... FORMAT HiveTextcomo três linhas. - Apenas o subconjunto padrão de
LazySimpleSerDe, sem escape, é implementado. Os campos são gravados sem escape (não há equivalente ao opcionalROW FORMAT DELIMITED ... ESCAPED BYdo Hive), eNULLé sempre gravado como\N(não há equivalente aNULL DEFINED AS). Portanto, umaStringque contenha um separador ativo de campo, linha ou aninhado é gravada literalmente e será interpretada incorretamente ao ser analisada novamente — isso corresponde ao comportamento do próprio Hive com uma serde sem escape. Pelo mesmo motivo, umaStringcujo valor seja literalmente\N(por exemplo,SELECT '\\N'::String FORMAT HiveText) é gravada com os mesmos dois bytes que umNULLreal; portanto, os dois são indistinguíveis no Hive.
Query