Aws Athena - Создайте внешнюю таблицу, пропустив первую строку

Я пытаюсь создать внешнюю таблицу в файлах csv с Aws Athena с кодом ниже, но строка 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")

Любые советы?

Ответ 1

Просто попробовал "skip.header.line.count"="1" и, похоже, сейчас работает нормально.

Ответ 2

Эта функция еще не реализована. Смотрите ответ Abhishek @AWS здесь:

"Мы работаем над этим и сообщим, как только у нас будет результат. Извините за это снова. Это заняло больше времени, чем мы ожидали".

Мой обходной путь заключается в предварительной обработке данных перед созданием таблицы:

  1. скачать CSV файл с S3
  2. sed -e 1d -e 's/\"//g' file.csv > file-2.csv заголовок, используя bash sed -e 1d -e 's/\"//g' file.csv > file-2.csv
  3. загрузить результаты в свою папку на S3
  4. создать таблицу

Ответ 3

Я недавно попробовал:

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

И теперь работает нормально. Эта проблема возникла, когда у меня был заголовок столбца в виде строки (метка времени) и записи, где были фактические метки времени. Мои запросы будут бомбить, как если бы они сканировали таблицу и находили строку вместо timestamp.

Что-то вроде этого:

Т.С.
2015-06-14 14: 45: 19.537
2015-06-14 14: 50: 20.546

Ответ 4

Когда был задан этот вопрос, не было поддержки пропуска заголовков, а когда он был позже представлен, он был только для OpenCSVSerDe, а не для LazySimpleSerDe, который что вы получите, когда укажете ROW FORMAT DELIMITED FIELDS …. Я думаю, что это вызвало некоторую путаницу в том, работает ли это в ответах на этот вопрос.

Ответ 5

На консоли 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"
        }
    }
}