1

我在 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 并且都有同样的问题

4

3 回答 3

2

不幸的是,Hive 中的 csv serde 不支持多个字符作为分隔符/引号/转义,看起来您想使用 2 个 backlslahes 作为 escapeChar(这是不可能的),而不是 OpenCSVSerde仅支持单个字符作为转义(实际上它正在使用CSVReader仅支持一个)。我不知道在 Hive 中支持多个字符的任何其他 SerDe,您始终可以使用其他库实现自己的 udf,而不是最流行的选项(没有人想要支持自己的东西 :))。我建议使用不同的字符作为转义符,希望你的数据中不存在这个字符。第二种选择是在摄取期间修改您的数据以替换\\\

于 2018-04-23T12:53:45.580 回答
0

在文档 "escapeChar"= "\\"中提到了两个反斜杠。请检查一下。

WITH SERDEPROPERTIES (
   "separatorChar" = "\t",
   "quoteChar"     = "'",
   "escapeChar"    = "\\"
)
于 2018-04-23T11:00:34.340 回答
0

我有一个类似的问题,可以解决将“escapeChar”=“\”更改为其他内容,例如“escapeChar”=“\n”。

于 2019-04-29T13:14:49.283 回答