косая черта не читается кустом при использовании OpenCSVSerde

Я определил таблицу поверх файлов, присутствующих в hdfs. Я использую OpenCSV Serde для чтения из файла. Но символы косой черты '\' в данных опускаются в окончательном наборе результатов.

Есть ли свойство hive serde, которое я неправильно использую? Согласно документации, escapeChar = '\' должен решить эту проблему. . Но проблема не устранена.

   CREATE EXTERNAL TABLE `tsr`(
    `last_update_user` string COMMENT 'from deserializer',
    `last_update_datetime` string COMMENT 'from deserializer')
    ROW FORMAT SERDE
    'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES (
    'escapeChar'='\',
    'quoteChar'='\"',
    'separatorChar'=',',
    'serialization.encoding'='UTF-8')
    STORED AS INPUTFORMAT
    'org.apache.hadoop.mapred.TextInputFormat'
    OUTPUTFORMAT
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION
    'hdfs://edl/hive/db/tsr'
    TBLPROPERTIES (
    'COLUMN_STATS_ACCURATE'='{\"BASIC_STATS\":\"true\"}',
    'numFiles'='1',
    'numRows'='1869',
    'rawDataSize'='0',
    'serialization.null.format'='',
    'totalSize'='144640',
    'transient_lastDdlTime'='1524479930')

Пример вывода:

DomainUser1 , 2017-07-04 19:07:27

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

Domain\User1 , 2017-07-04 19:07:27

РЕДАКТИРОВАТЬ 1: Я пробовал оба '\\' and '\' как escapeChar, и у обоих одинаковая проблема


person ForeverLearner    schedule 23.04.2018    source источник
comment
вы можете предоставить образцы данных для входного файла?   -  person hlagos    schedule 23.04.2018


Ответы (3)


К сожалению, csv serde в Hive не поддерживает несколько символов в качестве разделителя / кавычки / escape-последовательности, похоже, вы хотите использовать 2 backlslahes в качестве escapeChar (что невозможно), учитывая, что OpenCSVSerde поддерживает только один символ как escape (на самом деле он использует CSVReader, который поддерживает только один). Мне неизвестен какой-либо другой SerDe, который поддерживает несколько символов в Hive, вы всегда можете реализовать свой собственный udf с другой библиотекой, а не самым популярным вариантом (никто не хочет поддерживать свои собственные материалы :)). Я бы порекомендовал использовать в качестве escape-символа другой символ, надеюсь, тот, которого нет в ваших данных. Второй вариант - изменить ваши данные во время приема, чтобы заменить \ на \\.

person hlagos    schedule 23.04.2018
comment
Поговорили с исходными командами и остановились на персонаже, которого можно безопасно использовать для escapeChar. Спасибо за вашу помощь!! - person ForeverLearner; 24.04.2018

В документе "escapeChar"= "\\" упоминается с двумя обратными косыми чертами. пожалуйста, проверь это.

WITH SERDEPROPERTIES (
   "separatorChar" = "\t",
   "quoteChar"     = "'",
   "escapeChar"    = "\\"
)
person Community    schedule 23.04.2018
comment
'\\' заменяет escape-символ по умолчанию, которым является '\'. Я пробовал оба, и ни один из них не работает - person ForeverLearner; 23.04.2018
comment
установите 'escapeChar' в своих свойствах serde на что-то другое, кроме обратной косой черты - person ; 23.04.2018

У меня была аналогичная проблема, ее можно решить, заменив "escapeChar" = "\" на что-то другое, например "escapeChar" = "\ n".

person petikun    schedule 29.04.2019