Несколько escape-символов для таблицы создания улья

Я пытаюсь загрузить csv с разделителем каналов во внешнюю таблицу улья. Значения данных содержат одинарные кавычки, двойные кавычки, скобки и т. Д. Использование Open CSV версии 2.3

testfile.csv

id|name|phone
1|Rahul|123
2|Kumar's|456
3|Neetu"s|789
4|Ravi [Roma]|234

Таблица создана как -

drop table test_schema.hive_test;
CREATE EXTERNAL TABLE test_schema.hive_test (id string, name string, phone string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES
(
'separatorChar' = '|',
'quoteChar' = '[\'\"]',
'escapeChar' = '\\'
)
LOCATION '/staging/test/hive'
tblproperties ("skip.header.line.count"="1");

Вывод -

+-------------+---------------+----------------+
| hive_test.id|hive_test.name |hive_test.phone |
+-------------+---------------+----------------+
| 1           | Rahul         |123             |
| 2           | Kumar's       |456             |
| 3           | Neetu"s       |789             |
| 4           | NULL          |234             |
+---------------+------------------------------+

Ожидаемый результат -

+-------------+---------------+----------------+
| hive_test.id|hive_test.name |hive_test.phone |
+-------------+---------------+----------------+
| 1           | Rahul         |123             |
| 2           | Kumar's       |456             |
| 3           | Neetu"s       |789             |
| 4           | Ravi [Roma]   |234             |
+---------------+------------------------------+

Проблема в том, что у нас есть несколько символов escape-последовательностей / кавычек в данных, и, следовательно, нам нужно включить их все.


person Khilesh Chauhan    schedule 22.06.2021    source источник
comment
testfile.csv содержит строки без кавычек. он должен работать только с разделителем (разделителем), попробуйте установить 'quoteChar' = '' (пусто)   -  person leftjoin    schedule 22.06.2021
comment
"quoteChar" не должно быть пустым. Пытался создать таблицу с пустым символом кавычки, и она выдала ошибку String index out of range: 0   -  person Khilesh Chauhan    schedule 23.06.2021


Ответы (1)


Используйте LazySimpleSerDe (СОХРАНЯЕТСЯ КАК ТЕКСТФАЙЛ):

CREATE EXTERNAL TABLE test_schema.hive_test (id string, name string, phone string) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' 
ESCAPED BY '\\' 
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/staging/test/hive_test'
tblproperties ("skip.header.line.count"="1");
person leftjoin    schedule 23.06.2021
comment
Спасибо, отлично работает. Единственная проблема в том, что когда я удаляю файлы из LOCATION, таблица по-прежнему возвращает данные, когда я делаю: select * from hive_test. Мне действительно нужно обрезать hive_test, чтобы удалить данные. Почему это? - person Victor; 24.06.2021
comment
Местоположение @Victor должно быть специфичным для таблицы, а не только / staging / test / hive, я исправлю ответ, он должен выглядеть как / staging / test / hive_test. Проверьте расположение вашей таблицы с помощью DESCRIBE FORMATTED tablename. Если вы удаляете файлы из таблицы, она не должна возвращать данные. Просто проверьте правильность его расположения. Если вы также отбрасываете местоположение, выберите, если местоположение не найдено. Используйте hadoop fs -ls 'location / path /' для проверки наличия файлов - person leftjoin; 24.06.2021