【问题标题】:Creating Athena table with escape character before separator在分隔符之前创建带有转义字符的 Athena 表
【发布时间】:2020-06-15 10:16:55
【问题描述】:

我正在根据 s3 中的数据在 Athena 中创建表。这是查询的简短版本。

CREATE EXTERNAL TABLE `tablename`(
  `licensee_pub` string COMMENT 'from deserializer', 
  `admin_number` string COMMENT 'from deserializer', 
  `account_name` string COMMENT 'from deserializer', 
  `ipi_number` string COMMENT 'from deserializer', 
  `title` string COMMENT 'from deserializer', 
  `name` string COMMENT 'from deserializer',
  `play_minutes` string COMMENT 'from deserializer', 
  `play_seconds` string COMMENT 'from deserializer')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ( 
  'escapeChar'='\\', 
  'separatorChar'=',') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'path/to/s3'
TBLPROPERTIES (
  'has_encrypted_data'='false')

S3 中的文件以逗号分隔,虽然表创建得很好,但是文件中的记录行如下所示的几行存在问题

"a","b","c","d","abc ///def\\\","e","21","32"

没有正确创建“abc ///def\\”的行实例,将所有数据放在一个(标题)字段中,就像

abc ///def\",e,21,32

可能转义且未正确识别列。

有什么方法可以让 def\\ 之类的文本出现异常而不转义,或者任何其他解决方法?

【问题讨论】:

    标签: amazon-web-services etl aws-glue amazon-athena hive-serde


    【解决方案1】:

    DDL 中的escapeChar 属性表示转义字符是单个\escapeChar 中的反斜杠需要转义,因此两个反斜杠实际上是一个)。

    这意味着当 serde 遇到"\\\" 时,它将使用第一个反斜杠作为第二个的转义符,第三个作为" 的转义符。由于结束引号被转义,serde 将继续读取直到下一个(未转义)引号。

    如果您没有实际的转义引号,您可以将escapeChar 更改为其他内容,然后在您的应用程序中确定\\\ 的含义。

    【讨论】:

    • 不幸的是,我的字符串中有实际的转义引号。我需要用 \ 转义其他字符,但字符串末尾的那个。
    • 我认为你无法解决这个问题。 \" 表示转义引号或不表示转义引号,您不能表示它仅表示在某些情况下转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多