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

33

我正在尝试使用以下代码在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")

有什么建议吗?


在使用“create table as cte”创建表时,是否存在一种方法可以向TEXTFILE添加标题? - Cristián Vargas Acevedo
5个回答

55

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


实际上它已经不再起作用了。不确定什么时候才能真正修复。 - Filippo Loddo
6
TBLPROPERTIES('skip.header.line.count'='1')对我来说运行良好。 - Hussein Al-Far
4
它自2018年01月19日开始运行。请参见https://docs.aws.amazon.com/athena/latest/ug/release-note-2018-01-19.html - shawnzhu

7

在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"
        }
    }
}

5
这是一个尚未实现的功能。请在此处查看Abhishek@AWS的回应:链接
“我们正在努力解决,并将在有结果后及时报告。对此再次道歉。这项工作比我们预期的时间长。”
我采用的解决方法是在创建表格之前预处理数据:
1.从S3下载CSV文件
2.使用bash剥离表头sed-e 1d-e 's/\"//g' file.csv>file-2.csv 3.将结果上传到自己的S3文件夹中
4.创建表格

3
自 2018 年 01 月 19 日起,AWS Athena 上就已经提供了此功能。请参阅 https://docs.aws.amazon.com/athena/latest/ug/release-note-2018-01-19.html。
支持忽略标题行。您可以在定义表时使用 skip.header.line.count 属性,以允许 Athena 忽略标题行。
- shawnzhu
这个答案已经不正确了,应该取消接受它作为正确答案。skip.header.line.count是有效的。 - Nathan Feger

5

我最近尝试了:

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

现在它可以正常工作了。这个问题出现在我把列标题设置为字符串(时间戳),而记录实际上是时间戳时。我的查询会失败,因为它会扫描表格并发现一个字符串而不是 时间戳。就像这样:

时间戳
2015-06-14 14:45:19.537
2015-06-14 14:50:20.546


1
当这个问题被提出时,没有支持跳过标题的功能,当它 后来被引入 时,它只适用于 OpenCSVSerDe,而不是 LazySimpleSerDe,当你指定 ROW FORMAT DELIMITED FIELDS … 时会得到它。我认为这就是导致一些人对这个问题的答案是否有效感到困惑的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接