【问题标题】:HIVE - escape double quote issueHIVE - 逃避双引号问题
【发布时间】:2020-11-25 15:17:13
【问题描述】:

我正在尝试将带有管道分隔符的 csv 加载到配置单元外部表中。数据字段中出现的管道用引号括起来。数据中出现的双引号用 \ 转义。当我配置外部表时,我看到带有双引号的数据没有正确解释。

test.csv

id|name
105|"Test | pipe delim in field"
107|\" Test Escaped single double quote in HIVE
108|\" Test Escaped enclosed double quote in HIVE \"
109|\\" Test Escaped enclosed double quote in HIVE \"
110|\\" Test Escaped enclosed double quote in HIVE \\"

外部建表语句

drop table test_schema.hive_test;
CREATE EXTERNAL TABLE test_schema.hive_test (id string, name string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES
(
"separatorChar" = "|",
"quoteChar" = "\"",
"escapeChar" = "\\"
)
LOCATION '/staging/test/hive'
tblproperties ("skip.header.line.count"="1");

输出

+---------------+-------------------------------------------------+
| hive_test.id  |                 hive_test.name                  |
+---------------+-------------------------------------------------+
| 105           | Test | pipe delim in field                      |
| 107           | NULL                                            |
| 108           | NULL                                            |
| 109           | NULL                                            |
| 110           | " Test Escaped enclosed double quote in HIVE \  |
+---------------+-------------------------------------------------+

预期输出

+---------------+-------------------------------------------------+
| hive_test.id  |       hive_test.name                            |
+---------------+-------------------------------------------------+
| 105           | Test | pipe delim in field                      |
| 107           | " Test Escaped single double quote in HIVE      |
| 108           | " Test Escaped enclosed double quote in HIVE "  |
| 109           | NULL                                            |
| 110           | NULL                                            |
+---------------+-------------------------------------------------+

打开 CSV 版本 2.3

【问题讨论】:

  • 我尝试使用带有双反斜杠的附加行 109 和 110,如您共享的解决方案之一中所建议的那样。我看到 110 显示了价值,但第二个双引号再次没有正确显示。尝试更新问题

标签: hadoop hive opencsv hive-serde


【解决方案1】:

遗憾的是,这是不可能实现的,因为 OpenCSV 使用单个字符作为转义符,而实际上您正在尝试使用双反斜杠作为转义符(这将是 string)。在 OpenCSVSerde 类中你可以发现无论你传递什么作为转义字符,OpenCSVSerde 都会得到你的字符串值的第一个字符https://github.com/apache/hive/blob/master/serde/src/java/org/apache/hadoop/hive/serde2/OpenCSVSerde.java#L98

这是当前代码作为参考

  private char getProperty(final Properties tbl, final String property, final char def) {
final String val = tbl.getProperty(property);

if (val != null) {
  return val.charAt(0);
}

return def;

}

我认为缺少一个警告,让用户在创建表时知道仅支持单个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多