Por que minha consulta do Amazon Athena falha com o erro “HIVE_BAD_DATA: Erro ao analisar o valor do campo X: Para string de entrada: “12312845691””?

6 minuto de leitura
0

Quando consulto dados no Amazon Athena, recebo um erro semelhante a um dos seguintes: “HIVE_BAD_DATA: Erro ao analisar o valor do campo X: Para string de entrada: “12312845691” “HIVE_BAD_DATA: Erro ao analisar a coluna ‘0’: a escala alvo deve ser maior que a escala de origem.”

Breve descrição

Há várias versões do erro HIVE_BAD_DATA. Se a mensagem de erro especificar uma string de entrada nula ou vazia (por exemplo, “Para string de entrada: “"”), consulte Por que recebo o erro “HIVE_BAD_DATA: Erro ao analisar o valor do campo” para o campo X: Para a string de entrada: “”” quando eu consulto dados CSV no Amazon Athena?

Os erros que especificam uma string de entrada com um valor ocorrem sob uma das seguintes condições:

  • O tipo de dado definido na definição da tabela não corresponde aos dados de origem reais.
  • Um único campo contém diferentes tipos de dados, como um valor inteiro para um registro e um valor decimal para outro registro.

Resolução

É uma prática recomendada usar somente um tipo de dados em uma coluna. Caso contrário, a consulta poderá falhar. Para resolver erros, certifique-se de que cada coluna contenha valores do mesmo tipo de dados e que os valores estejam nos intervalos permitidos.

Se você ainda receber erros, altere o tipo de dados da coluna para um tipo de dados compatível que tenha um intervalo maior. Se a alteração do tipo de dados não resolver o problema, tente as soluções nos exemplos a seguir.

Exemplo 1

  • Formato de origem: JSON
  • **Problema:**No último registro, o valor da chave “id” é “0,54”, que é o tipo de dados DECIMAL. Para os outros registros, o valor da chave “id” é definido como INT.

Dados de origem:

{ "id" : 50, "name":"John" }
{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }
{ "id" : 0.54, "name":"Jill" }

Declaração de linguagem de definição de dados (DDL):

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data (
    id INT,
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data/';

Declaração da linguagem de manipulação de dados (DML):

SELECT *
FROM jsontest_error_hive_bad_data

Erro:

Your query has the following error(s):
HIVE_BAD_DATA: Error parsing field value '0.54' for field 0: For input string: "0.54"
This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: bd50793b-94fc-42a7-b131-b7c81da273b2.

Para resolver esse problema, redefina a coluna “id” como STRING. O tipo de dado STRING pode representar corretamente todos os valores nesse conjunto de dados. Exemplo:

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_correct_id_data_type (
    id STRING,
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data/';

Declaração DML:

SELECT *
FROM jsontest_error_hive_bad_data_correct_id_data_type

Você também pode lançar para o tipo de dados desejado. Por exemplo, você pode lançar uma string como um número inteiro. No entanto, dependendo dos tipos de dados de e para os quais você está lançando, isso pode retornar resultados nulos ou imprecisos. Valores que não podem ser lançados são descartados. Por exemplo, lançar o valor da string “0,54” para INT retorna resultados nulos:

SELECT TRY_CAST(id AS INTEGER)
FROM jsontest_error_hive_bad_data_correct_id_data_type

Exemplo de saída:

Results
     _col0
1    50
2    51
3    53
4

A saída mostra que o valor “0,54” foi descartado. Você não pode lançar esse valor diretamente de uma string para um número inteiro. Para resolver esse problema, use o COALESCE (do site do Presto) para lançar os valores de tipo misto na mesma coluna da saída. Em seguida, permita que a função agregada seja executada na coluna. Exemplo:

SELECT COALESCE(TRY_CAST(id AS INTEGER), TRY_CAST(id AS DECIMAL(10,2)))
FROM jsontest_error_hive_bad_data_correct_id_data_type

Saída:

Results
     _col0
1    50.00
2    51.00
3    53.00
4    0.54

Execute funções agregadas:

SELECT SUM(COALESCE(TRY_CAST(id AS INTEGER), TRY_CAST(id AS DECIMAL(10,2))))
FROM jsontest_error_hive_bad_data_correct_id_data_type

Saída:

_col0
1    154.54

Exemplo 2

  • Formato de origem: JSON
  • Problema: A coluna “id” é definida como INT. O Athena não conseguiu analisar “49612833315” porque o intervalo dos valores INT no Presto é de -2147483648 a 2147483647.

Dados de origem:

{ "id" : 50, "name":"John" }
{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }
{ "id" : 49612833315, "name":"Jill" }

Declaração DDL:

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_2 (
    id INT,
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_2/';

Declaração DML:

SELECT *
FROM jsontest_error_hive_bad_data_sample_2

Erro:

Your query has the following error(s):
HIVE_BAD_DATA: Error parsing field value '49612833315' for field 0: For input string: "49612833315"
This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: 05b55fb3-481a-4012-8c0d-c27ef1ee746f.

Para resolver esse problema, defina a coluna “id” como BIGINT, que pode ler o valor “49612833315”. Para obter mais informações, consulte Tipos de inteiros.

Declaração DDL modificada:

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_2_corrected (
    id BIGINT,
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_2/';

Exemplo 3

  • Formato de origem: JSON
  • Problema: Os dados de entrada são DECIMAL, e a coluna é definida como DECIMAL na definição da tabela. No entanto, a escala é definida como 2, o que não corresponde ao valor “0,000054". Para obter mais informações, consulte Tipo DECIMAL ou NUMÉRICO.

Dados de origem:

{ "id" : 0.50, "name":"John" }
{ "id" : 0.51, "name":"Jane" }
{ "id" : 0.53, "name":"Jill" }
{ "id" : 0.000054, "name":"Jill" }

Declaração DDL:

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_3(
    id DECIMAL(10,2),
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_3/';

Declaração DML:

SELECT *
FROM jsontest_error_hive_bad_data_sample_3

Erro:

Your query has the following error(s):
HIVE_BAD_DATA: Error parsing column '0': target scale must be larger than source scale
This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: 1c3c7278-7012-48bb-8642-983852aff999.

Para resolver esse problema, redefina a coluna com uma escala que capture todos os valores de entrada. Por exemplo, em vez de (10,2), use (10,7).

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_3_corrected(
    id DECIMAL(10,7),
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_3/';

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos