代码之家  ›  专栏  ›  技术社区  ›  ForeverLearner

使用OpenCSVSerde上的配置单元未读取字符斜杠

  •  1
  • ForeverLearner  · 技术社区  · 6 年前

    我在hdfs中存在的文件之上定义了一个表。我正在使用OpenCSV Serde从文件中读取。但是,在最终结果集中,数据中的“\”斜杠字符被省略。

    是否存在我未正确使用的hive serde属性。根据 documentation ,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 '\' 因为逃逸车和两者都有同样的问题

    3 回复  |  直到 6 年前
        1
  •  2
  •   hlagos    6 年前

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

        2
  •  0
  •   user9601917 user9601917    6 年前

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

    WITH SERDEPROPERTIES (
       "separatorChar" = "\t",
       "quoteChar"     = "'",
       "escapeChar"    = "\\"
    )
    
        3
  •  0
  •   petikun    5 年前

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

    推荐文章