HIVE - избегайте двойных кавычек - PullRequest
1 голос
/ 05 августа 2020

Я пытаюсь загрузить csv с разделителем каналов во внешнюю таблицу улья. Канал, встречающийся в полях данных, заключен в кавычки. Двойные кавычки, встречающиеся в данных, экранируются символом \. Когда я настраиваю внешнюю таблицу, я вижу, что данные с двойными кавычками не интерпретируются должным образом.

test.csv

id|name
105|"Test | pipe delim in field"
107|\" Test Escaped single double quote in HIVE
108|\" Test Escaped enclosed double quote in HIVE \"
109|\\" Test Escaped enclosed double quote in HIVE \"
110|\\" Test Escaped enclosed double quote in HIVE \\"

Оператор создания внешней таблицы

drop table test_schema.hive_test;
CREATE EXTERNAL TABLE test_schema.hive_test (id string, name 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                  |
+---------------+-------------------------------------------------+
| 105           | Test | pipe delim in field                      |
| 107           | NULL                                            |
| 108           | NULL                                            |
| 109           | NULL                                            |
| 110           | " Test Escaped enclosed double quote in HIVE \  |
+---------------+-------------------------------------------------+

Ожидаемый вывод

+---------------+-------------------------------------------------+
| hive_test.id  |       hive_test.name                            |
+---------------+-------------------------------------------------+
| 105           | Test | pipe delim in field                      |
| 107           | " Test Escaped single double quote in HIVE      |
| 108           | " Test Escaped enclosed double quote in HIVE "  |
| 109           | NULL                                            |
| 110           | NULL                                            |
+---------------+-------------------------------------------------+

Открытая версия CSV 2.3

1 Ответ

0 голосов
/ 19 августа 2020

К сожалению, этого невозможно достичь, потому что OpenCSV использует одиночный символ как escape, и на самом деле вы пытаетесь использовать двойной backsla sh как escape-символ (который был бы string). В классе OpenCSVSerde вы можете обнаружить, что независимо от того, что вы передаете в качестве escape-символа, OpenCSVSerde получает первый символ вашего строкового значения https://github.com/apache/hive/blob/master/serde/src/java/org/apache/hadoop/hive/serde2/OpenCSVSerde.java#L98

Вот текущий код в качестве ссылки

  private char getProperty(final Properties tbl, final String property, final char def) {
final String val = tbl.getProperty(property);

if (val != null) {
  return val.charAt(0);
}

return def;

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...