Двойные кавычки не удаляются даже после использования org.apache.hadoop.hive.serde2.OpenCSVSerde - PullRequest
0 голосов
/ 11 мая 2019

У меня есть внешняя таблица с DDL, как показано ниже:

CREATE EXTERNAL TABLE pathirippilly_db.serdeTest (Name varchar(50),Job varchar(50),Sex varchar(4))
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES
(
    "separatorChar" = ",",
    "quoteChar"     = "\""
)
STORED AS TEXTFILE
location "/user/pathirippilly/hive_data_external/serdeTest";

После создания таблицы с указанным выше DDL я вставляю данные, как показано ниже:

insert into serdetest values('"AKHIL"','Engineer','Male');

Но двойные кавычки по-прежнему не экранируются (не удаляются) даже после определения opencsv serde. Так вот мой вопрос

  1. Где я иду не так
  2. Скажем, если у меня есть несколько кавычек для экранирования, например, мне нужно удалить одинарные и двойные кавычки из моих входных данных. Как я могу добиться этого с помощью opencsv serde.
  3. Согласно Apache [https://cwiki.apache.org/confluence/display/Hive/CSV+Serde#CSVSerde-Usage][1] даже если я не определил quoteChar и escapeChar, он должен автоматически выбирать двойные кавычки с escape-символом как "\" и автоматически удалять двойные кавычки из данных. Но почему это не происходит в моем коде

1 Ответ

0 голосов
/ 11 мая 2019

1-й и 3-й вопрос похожи - почему двойные кавычки не удаляются?

Это потому, что SerDe не используется при вставке данных непосредственно в таблицу.SerDe означает Serializer / Deserializer, а Hive использует его для чтения / записи строк таблицы из / в файл.

HDFS файлы -> InputFileFormat -> -> Deserializer -> Row object

Объект Row -> Serializer -> -> OutputFileFormat -> HDFS файлы

Попробуйте вставить данные в таблицу кустов с помощью команды load, и вы увидите, что она работает.

load data local inpath '/home/hive/test/test.csv' into table serdetest;

Пример - test.csv

"AKHIL",Engineer,Male

Для получения более подробной информации, пожалуйста, посетите страницу Hive Wiki .

2-й вопрос - Как избежать нескольких символов кавычки?

Это можно сделать с помощью ' RegexSerDe '.

CREATE EXTERNAL TABLE serdetest (Name varchar(50),Job varchar(50),Gender 
varchar(6))
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES (
'input.regex' = '^\"(\\d+)\\W+\\W+(\\w+).*'
)
STORED AS TEXTFILE
location "/user/pathirippilly/hive_data_external/serdeTest";

Примечание. Например, приведенное в утверждении регулярное выражение не соответствует действительности.

Надеюсь, это поможет!

...