AWS Glue: Crawler не распознает столбцы меток времени в формате CSV - PullRequest
0 голосов
/ 17 мая 2019

При работе сканера клея AWS он не распознает столбцы меток времени.

Я правильно отформатировал метки времени ISO8601 в своем файле CSV. Сначала я ожидал, что Glue автоматически классифицирует их как метки времени, а это не так.

Я также попробовал пользовательский классификатор меток времени по этой ссылке https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html

Вот как выглядит мой классификатор

grok classifier

Это также неправильно классифицирует мои метки времени.

Я поместил в отладчик grok (https://grokdebug.herokuapp.com/) мои данные, например

id,iso_8601_now,iso_8601_yesterday
0,2019-05-16T22:47:33.409056,2019-05-15T22:47:33.409056
1,2019-05-16T22:47:33.409056,2019-05-15T22:47:33.409056

и совпадает на обоих

* *% Тысяча двадцать-один {TIMESTAMP_ISO8601: временная метка}

% {YEAR} -% {MONTHNUM} -% {MONTHDAY} [T]% {HOUR}:?% {MINUTE} (? ::?% {SECOND})?% {ISO8601_TIMEZONE}?

import csv
from datetime import datetime, timedelta

with open("timestamp_test.csv", 'w', newline='') as f:
    w = csv.writer(f, delimiter=',')

    w.writerow(["id", "iso_8601_now", "iso_8601_yesterday"])

    for i in range(1000):
        w.writerow([i, datetime.utcnow().isoformat(), (datetime.utcnow() - timedelta(days=1)).isoformat()])

Я ожидаю, что клей AWS автоматически классифицирует столбцы iso_8601 как метки времени. Даже при добавлении пользовательского классификатора grok он не классифицирует ни один из столбцов как метку времени.

Оба столбца классифицируются как строки.

Классификатор активен на гусеничном ходу classifier active

Вывод таблицы timestamp_test сканером

{
    "StorageDescriptor": {
        "cols": {
            "FieldSchema": [
                {
                    "name": "id",
                    "type": "bigint",
                    "comment": ""
                },
                {
                    "name": "iso_8601_now",
                    "type": "string",
                    "comment": ""
                },
                {
                    "name": "iso_8601_yesterday",
                    "type": "string",
                    "comment": ""
                }
            ]
        },
        "location": "s3://REDACTED/_csv_timestamp_test/",
        "inputFormat": "org.apache.hadoop.mapred.TextInputFormat",
        "outputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
        "compressed": "false",
        "numBuckets": "-1",
        "SerDeInfo": {
            "name": "",
            "serializationLib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
            "parameters": {
                "field.delim": ","
            }
        },
        "bucketCols": [],
        "sortCols": [],
        "parameters": {
            "skip.header.line.count": "1",
            "sizeKey": "58926",
            "objectCount": "1",
            "UPDATED_BY_CRAWLER": "REDACTED",
            "CrawlerSchemaSerializerVersion": "1.0",
            "recordCount": "1227",
            "averageRecordSize": "48",
            "CrawlerSchemaDeserializerVersion": "1.0",
            "compressionType": "none",
            "classification": "csv",
            "columnsOrdered": "true",
            "areColumnsQuoted": "false",
            "delimiter": ",",
            "typeOfData": "file"
        },
        "SkewedInfo": {},
        "storedAsSubDirectories": "false"
    },
    "parameters": {
        "skip.header.line.count": "1",
        "sizeKey": "58926",
        "objectCount": "1",
        "UPDATED_BY_CRAWLER": "REDACTED",
        "CrawlerSchemaSerializerVersion": "1.0",
        "recordCount": "1227",
        "averageRecordSize": "48",
        "CrawlerSchemaDeserializerVersion": "1.0",
        "compressionType": "none",
        "classification": "csv",
        "columnsOrdered": "true",
        "areColumnsQuoted": "false",
        "delimiter": ",",
        "typeOfData": "file"
    }
}

1 Ответ

0 голосов
/ 19 мая 2019

Согласно CREATE TABLE doc, формат отметки времени равен yyyy-mm-dd hh:mm:ss[.f...]

Если вы должны использовать формат ISO8601, добавьте этот параметр Serde 'timestamp.formats'='yyyy-MM-dd\'T\'HH:mm:ss.SSSSSS'

Вы можете изменить стол из Клея (1) или воссоздать его из Афины (2):

  1. Склеить консоль> таблицы> редактировать таблицу> добавить вышеизложенное в параметры Serde. Вам также нужно будет нажать «изменить схему» и изменить тип данных со строки на отметку времени
  2. Из Афины удалите таблицу и запустите:
CREATE EXTERNAL TABLE `table1`(
  `id` bigint, 
  `iso_8601_now` timestamp, 
  `iso_8601_yesterday` timestamp)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES ( 
  'field.delim' = ',',
  'timestamp.formats'='yyyy-MM-dd\'T\'HH:mm:ss.SSSSSS') 
LOCATION
  's3://REDACTED/_csv_timestamp_test/'
...