Ошибка создания таблицы, хранящейся в виде текстового файла из представления - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь загрузить информацию из представления в таблицу Hive, сохраненную в виде текстового файла, настроенного так:

CREATE TABLE table1 (
field1 BIGINT
,field2 STRING
,email STRING
,field3 BIGINT
,field4 STRING
) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\u0001' 
LINES TERMINATED BY '\n'
STORED AS TEXTFILE ;

Дело в том, что после создания таблицы я вставляю информацию из представления следующим образом:

insert into table1 as 
select 
field1 
,field2 
,email 
,field3 
,field4 
from v_table2 ;

Процесс возвращает успех, но когда я проверяю данные в таблице 1, оператор выбора возвращает следующий вывод:

Error converting column: 4 to BIGINT

Информация в этом поле возвращает значение NULL, когда есть информацияв этом поле в представлении, но оператор вставки не возвращает никакой ошибки.

Кроме того, я могу правильно загрузить первое поле BIGINT, но в полях электронной почты отображается «квадрат» и поле BIGINT после этого даетошибка.При проверке данных в файле кажется, что информация переносится после поля электронной почты.

Похоже на некоторую проблему с кодировкой.

Уже пытались форсировать кодирование, как это, но не повезло:

ALTER TABLE table1 SET SERDEPROPERTIES('serialization.format'='\u0001', 'serialization.encoding'='windows-1252');

Я должен также упомянуть, что поля, которые загружаются в table1 из представления, уже являются BIGINT в таблице, из которой представление загружает информацию.

Кто-нибудь может помочь?


Решение

После некоторых исследований мне удалось найти решение, создав таблицу назначения со следующим определением:

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES ('separatorChar'='\u0001', 'quoteChar'="'", 'escapeChar' = '\\')
STORED AS TEXTFILE 

И обработав данные наполе «электронная почта» вот так:

case 
    when ascii(email_fe) <> 1 
    then email_fe 
    else NULL 
end email_fe

для полей «электронная почта», где появляются странные данные, я проверил, что код ascii всегда был 1 ипроверив это в операторе select, я мог бы соответствующим образом обработать информацию и получить данные в таблице для других полей, вставленных правильно.

У кого-нибудь есть лучшиеродной?

1 Ответ

0 голосов
/ 27 марта 2019

Можете ли вы попробовать это, пожалуйста? Эта ошибка возникает, поскольку в созданной таблице есть столбец bigint, и мы пытаемся вставить значение типа int

вставить в таблицу как Выбрать field1 , field2 ,Эл. адрес В ролях (field3 как bigint) , Field4 из v_table2;

...