AWS Результат запроса выбора Афины включает данные непостоянно - PullRequest
0 голосов
/ 02 апреля 2020

Среда
Сбор необработанных данных из python3 .7 -> boto3 -> S3.
С паркетом (сериализовано с fastparquet)
Использование Glue Crawler с ненастроенными (просто создать, назначить роль IAM, цель s3, создать пустой каталог данных)



Проблема
Следующий запрос Афины возвращает только до 2020 -04-01:

SELECT * FROM "rawdata" where "partition_0" >= '2020-03-29' and "partition_0" <= '2020-04-02';
SELECT * FROM "rawdata" where  ("partition_0" = '2020-03-29' or "partition_0" = '2020-03-30' or "partition_0" = '2020-03-31' or "partition_0" = '2020-04-01' or "partition_0" = '2020-04-02')
#These two queries are same meaning, same result.  

Но, если в следующий раз я сделаю запрос на мясо птицы Афины, будет возвращено значение 2020-04-02.

SELECT * FROM "rawdata" where "partition_0" >= '2020-04-02' and "partition_0" <= '2020-04-02';
SELECT * FROM "rawdata" where "partition_0" = '2020-04-02';
#Also these two queries are same meaning, same result.  



Структура
S3-разделы выполняются в следующем формате:

bucketname/collectorname/merged/rawdata/yyyy-mm-dd/data.parquet

Glue Crawler имеет собственный каталог данных, имя которого совпадает с Glue Crawler.
И цель Glue Crawler следующая

bucketname/collectorname/merged/rawdata

Роль IAM каждого сканера клея одинакова, у них есть две AWS управляемые политики.

AWSGlueServiceRole
AmazonS3ReadOnlyAccess

Файл паркета сохраняется с pandas .to_parquet с fastparquet, не сжимается .
Я не редактировал никаких скриптов в Glue Crawler.



Рабочий процесс * 1 045 * Коллектор собирает 3000 строк каждые 3 минуты. (Пн-Пт, с 9:00 до 15:30 PM)
Таким образом, он объединяется с 3000 колонным паркетом для сохранения в следующем формате

#always next data (because 3 min term, but it is saperated with seconds)
bucketname/collectorname/notmerged/rawdata/yyyy-mm-dd/hh_mm_ss.parquet.bz2

#always overwrited, if someone request latest snapshot, system just use it (not athena)
bucketname/collectorname/cached/latest/data.parquet

И в следующий раз, парсер работает.
Парсер также сделан на python3 .7 и его псевдокод следующий.

import pandas as pd
import io
import boto3MyCustomWrapped

#download last collected dataframe
dfnew = pd.read_parquet(io.BytesIO(unzip(boto3MyCustomWrapped.s3.get_object(bucket="bucketname",key="collectorname/cached/latest/data.parquet.bz2")))

#today yyyy-mm-dd
strftime_of_today_datetime_yyyy_mm_dd = datetime.datetime.utcnow().strftime('%Y-%m-%d')

#merged data
dfold = pd.read_parquet(io.BytesIO(boto3MyCustomWrapped.s3.get_object(bucket="bucketname",key=f"collectorname/merged/{strftime_of_today_datetime_yyyy_mm_dd}/data.parquet"))

#some process is skipped (like processing if dfold not exist)
dfmerged = pd.concat([dfold, dfnew])

#validate for athena optimize (like column type clean)
dfmerged = validate_and_process_and_sort_and_clean_index(dfmerged)

#upload overwrite onto dfold's s3 path (!!data catalog is connected only this path!!)
boto3MyCustomWrapped.s3.put_object_from_dataframe(bucket="bucketname",
    key=f"collectorname/merged/{strftime_of_today_datetime_yyyy_mm_dd}/data.parquet", dfmerged)

#today's glue crawling
if datetime.datetime.utcnow().hour == 9 and datetime.datetime.utcnow().minute < 10:
    boto3MyCustomWrapped.glue.try_start_crawler('collectorname')



Вопрос
Как я могу работать с возвращениями Афины сегодня с 'включая сегодня 'запрос? (не только запрос «точный сегодня»)
Проблема в том, что результат Афины включает или не включает условные данные «сегодня», даже каждый мой запрос содержит «сегодня».
И я не знаю, почему и как fix



Дополнительная информация

Нет ошибок, возвращаемых Афиной во всех ситуациях, и все возвраты имеют нормальные столбцы.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Долгое время наблюдал, Эта проблема никогда не повторится. (Я ничего не делал)
Короче, наконец, я не могу понять, почему это произошло.
Я чувствую себя немного неуверенно по этому поводу, но я чувствую ответственность за помощь Габипа в моем вопросе.

Все, что я сделал, это

  1. Создайте новый каталог данных с именем без '.' (например, имя каталога - «crawling.siteurl.itemtype», а имя таблицы - «rawdata», я создал новую таблицу с именем «crawlingsiteurlitemtype». «rawdata»)
  2. То же самое сканирование выполняется из того же источника.
  3. показать разделы для "crawlingsiteurlitemtype". "Rawdata" работает хорошо (и содержит 2020-04-02)
  4. показать разделы и восстановление msck не работают с моей исходной таблицей. ("crawling.siteurl.itemtype". "rawdata")
  5. , но после 3 и 4 неожиданно результат запроса athena к моей исходной таблице содержит данные '2020-04-02'.
  6. Я копал сегодня, но не могу найти, что заставляет его работать, и сегодня, запрос к исходному каталогу данных все еще возвращает хороший ответ '2020-04-06 (= сегодня)'
  7. Поэтому я перестал копать, как знать, Но чувствую себя немного неуверенно, потому что Когда-нибудь, это может снова вспыхнуть.

В любом случае, спасибо за ответ!

0 голосов
/ 02 апреля 2020

Чтобы запросить новые разделы в Афине, вы должны явно добавить их:

ALTER TABLE rawdata ADD
  PARTITION (partition_0 = '2020-04-02');

или добавив все разделы вместе, используя:

msck repair table rawdata

Я думаю, что в вашем В этом случае первый запрос выполнялся до того, как был добавлен раздел (сканером клея), и поэтому данные '2020-04-02' были недоступны.

...