Среда
Сбор необработанных данных из 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
Дополнительная информация
Нет ошибок, возвращаемых Афиной во всех ситуациях, и все возвраты имеют нормальные столбцы.