Aws Athena - 创建外部 table 跳过第一行

Aws Athena - Create external table skipping first row

我正在尝试使用 Aws Athena 使用以下代码在 csv 文件上创建一个外部 table,但是 TBLPROPERTIES ("skip.header.line.count"="1") 行不起作用:它不会跳过第一行 ( header) 的 csv 文件。

CREATE EXTERNAL TABLE mytable
(
  colA string,
  colB int
  )

 ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
 WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '\"',
   'escapeChar' = '\'
   )
STORED AS TEXTFILE
LOCATION 's3://mybucket/mylocation/'
TBLPROPERTIES (
  "skip.header.line.count"="1")

有什么建议吗?

这是一个尚未实现的功能。查看 Abhishek@AWS 的回复 here

"We are working on it and will report back as soon as we have an outcome. Sorry for this again. This ended up taking longer than what we anticipated."

我的解决方法是在创建 table:

之前预处理数据
  1. 从 S3 下载 csv 文件
  2. 使用 bash sed -e 1d -e 's/\"//g' file.csv > file-2.csv
  3. 删除 header
  4. 将结果上传到 S3 上自己的文件夹中
  5. 创建 table

刚刚尝试了 "skip.header.line.count"="1",现在似乎工作正常。

我最近尝试过:

TBLPROPERTIES ('skip.header.line.count'='1')

现在可以正常使用了。当我将 header 列作为字符串(时间戳)和包含实际时间戳的记录时,出现了这个问题。我的查询会爆炸,因为它会扫描 table 并找到一个字符串而不是 timestamp

像这样:

ts
2015-06-14 14:45:19.537
2015-06-14 14:50:20.546

当提出这个问题时,不支持跳过 headers,而当 was later introduced it was only for the OpenCSVSerDe, not for LazySimpleSerDe 时,这就是您指定 ROW FORMAT DELIMITED FIELDS … 时得到的结果。我认为这就是导致人们对该问题的答案是否有效感到困惑的原因。

在 AWS 控制台上,您可以将其指定为 Serde 参数键值对

虽然如果您将基础设施作为代码与 terraform 一起应用,您可以使用 ser_de_info 参数 - "skip.header.line.count" = 1.示例如下

resource "aws_glue_catalog_table" "banana_datalake_table" {
  name          = "mapping"
  database_name = "banana_datalake"
  table_type    = "EXTERNAL_TABLE"
    owner = "owner"
    storage_descriptor {
        location        = "s3://banana_bucket/"
        input_format    = "org.apache.hadoop.mapred.TextInputFormat"
        output_format   = "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
        compressed  = "false"
        number_of_buckets = -1    
        ser_de_info {
            name    = "SerDeCsv"
            serialization_library = "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe"
            parameters {
                "field.delim" = ","
                "skip.header.line.count" = 1    # Skip file headers
            }
        }
        columns {
            name    = "column_1"
            type    = "string"
        }
        columns {
            name    = "column_2"
            type    = "string"
        }
        columns {
            name    = "column_3"
            type    = "string"
        }
    }
}