Я пытаюсь загрузить информацию из представления в таблицу 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, я мог бы соответствующим образом обработать информацию и получить данные в таблице для других полей, вставленных правильно.
У кого-нибудь есть лучшиеродной?