使用 OpenCSVSerde 时,配置单元未读取字符斜线
character slash is not being read by hive on using OpenCSVSerde
我在 hdfs 中存在的文件之上定义了一个 table。我正在使用 OpenCSV
Serde 从文件中读取。但是,数据中的 '\' 斜杠字符在最终结果集中被省略。
是否有我没有正确使用的配置单元 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 '\'
作为 escapeChar 并且都有同样的问题
在文档中提到 "escapeChar"= "\"
时带有两个反斜杠。请查收。
WITH SERDEPROPERTIES (
"separatorChar" = "\t",
"quoteChar" = "'",
"escapeChar" = "\"
)
不幸的是,Hive 中的 csv serde 不支持多个字符 separator/quote/escape,考虑到 OpenCSVSerde
只支持一个单个字符作为转义符(实际上它使用 CSVReader 只支持一个)。我不知道在 Hive 中支持多个字符的任何其他 SerDe,您始终可以使用其他库实现您自己的 udf,而不是最流行的选项(没有人想要支持它自己的东西 :))。我建议使用不同的字符作为转义符,希望您的数据中不存在该字符。第二种选择是在摄取期间修改您的数据,以将 \
替换为 \
我有一个类似的问题,将 "escapeChar" = "\" 更改为其他内容即可解决,例如 "escapeChar" = "\n"。
我在 hdfs 中存在的文件之上定义了一个 table。我正在使用 OpenCSV Serde 从文件中读取。但是,数据中的 '\' 斜杠字符在最终结果集中被省略。
是否有我没有正确使用的配置单元 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 '\'
作为 escapeChar 并且都有同样的问题
在文档中提到 "escapeChar"= "\"
时带有两个反斜杠。请查收。
WITH SERDEPROPERTIES (
"separatorChar" = "\t",
"quoteChar" = "'",
"escapeChar" = "\"
)
不幸的是,Hive 中的 csv serde 不支持多个字符 separator/quote/escape,考虑到 OpenCSVSerde
只支持一个单个字符作为转义符(实际上它使用 CSVReader 只支持一个)。我不知道在 Hive 中支持多个字符的任何其他 SerDe,您始终可以使用其他库实现您自己的 udf,而不是最流行的选项(没有人想要支持它自己的东西 :))。我建议使用不同的字符作为转义符,希望您的数据中不存在该字符。第二种选择是在摄取期间修改您的数据,以将 \
替换为 \
我有一个类似的问题,将 "escapeChar" = "\" 更改为其他内容即可解决,例如 "escapeChar" = "\n"。