【问题标题】:Aws Athena - Create external table skipping first rowAws Athena - 创建跳过第一行的外部表
【发布时间】:2018-03-09 04:27:39
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: amazon-athena


    【解决方案1】:

    这是一个尚未实现的功能。请参阅 Abhishek@AWS 的回复 here

    “我们正在努力,一旦我们有一个 结果。再次为此感到抱歉。这最终花费了比什么更长的时间 我们预料到了。”

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

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

    【讨论】:

    • 此功能自 2018 年 1 月 19 日起在 AWS Athena 上可用。请参阅docs.aws.amazon.com/athena/latest/ug/… > 支持忽略标头。您可以在定义表时使用 skip.header.line.count 属性,以允许 Athena 忽略标题。
    • 此答案不再正确,不应作为正确答案接受。 skip.header.line.count 确实有效。
    【解决方案2】:

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

    【讨论】:

    • 其实已经不行了。不知道什么时候才能真正解决。
    • TBLPROPERTIES ('skip.header.line.count'='1') .. 对我来说效果很好
    • 它从 2018-01-19 开始工作。见docs.aws.amazon.com/athena/latest/ug/…
    【解决方案3】:

    我最近尝试过:

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

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

    类似这样的:

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

    【讨论】:

      【解决方案4】:

      当这个问题被问到时,不支持跳过标题,而当它was later introduced 时,它仅适用于 OpenCSVSerDe,而不适用于 LazySimpleSerDe,这是您在指定 ROW FORMAT DELIMITED FIELDS … 时得到的。我认为这引起了人们对它是否适用于这个问题的答案的一些困惑。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-26
          • 2017-12-16
          • 2019-04-09
          • 2020-09-29
          • 2019-05-03
          • 2022-10-14
          • 1970-01-01
          相关资源
          最近更新 更多