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

时间:2017-09-27 15:39:32

标签: amazon-athena

我尝试使用Aws Athena在csv文件上创建一个外部表格,但代码如下但行TBLPROPERTIES ("skip.header.line.count"="1")不起作用:它不会跳过第一行(标题)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")

有任何建议吗?

5 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:5)

这是一项尚未实施的功能。请参阅Abhishek @ AWS'回复here

  

“我们正在努力,并会在我们收到报告后立即报告   结果。对此再次抱歉。最终花费的时间超过了   我们预料到了。“

我的解决方法是在创建表格之前预处理数据:

  1. 从S3下载csv文件
  2. 使用bash sed -e 1d -e 's/\"//g' file.csv > file-2.csv
  3. 删除标题
  4. 将结果上传到S3上的自己的文件夹
  5. 创建表格

答案 2 :(得分:0)

我最近尝试过:

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

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

类似的东西:

  

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

答案 3 :(得分:0)

询问此问题时,不支持跳过标头,当它was later introduced时仅适用于OpenCSVSerDe,而不适用于LazySimpleSerDe,这是您获得的内容指定ROW FORMAT DELIMITED FIELDS …。我认为这是对它在该问题的答案中是否起作用的困惑。

答案 4 :(得分:0)

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

skip header in athena table

如果将基础设施作为具有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"
        }
    }
}