Как выбрать данные из таблицы aws athena, которая разделена как «год = гггг / месяц = ​​мм / дата = дд /» для заданного диапазона дат? - PullRequest
0 голосов
/ 18 апреля 2020

Таблицы Athena разделены так же, как и путь к папке s3

parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=17
parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=9
parent=0fc966a0-bba7-4c0b-a648-cff7f0332059/year=2020/month=4/date=16
parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=14
PARTITIONED BY ( 
  `parent` string, 
  `year` int, 
  `month` tinyint, 
  `date` tinyint)

Теперь, как мне сформировать условие where для запроса на выборку, чтобы получить данные для parent = "9ab4fcca-65d8-11ea -bc55-0242ac130003 "с 2019-06-01 по 2020-04-31?

SELECT *  
 FROM table 
 WHERE parent = '9ab4fcca-65d8-11ea-bc55-0242ac130003' AND year >= 2019 AND year <= 2020 AND month >= 04 AND month <= 06 AND date >= 01 AND date <= 31 ;

Но это не правильно. Пожалуйста, помогите

Ответы [ 2 ]

3 голосов
/ 19 апреля 2020

Разделение по годам, месяцам и дням по отдельности делает ненужным затруднение запроса таблиц. Если вы только начинаете, я действительно советую избегать такой схемы разбиения. Если вы не можете избежать этого, вы все равно можете упростить задачу, создавая разделы таблицы по-разному.

В большинстве руководств вам предложат создать структуры каталогов, такие как year=2020/month=4/date=1/file1, создать таблицу с тремя соответствующими столбцами разделов и затем запустите MSCK REPAIR TABLE для загрузки разделов. Это работает, но это далеко не лучший способ использовать Афину. MSCK REPAIR TABLE обладает ужасной производительностью, и подобное разбиение далеко от идеала.

Я предлагаю создать структуры каталогов, которые просто 2020-03-01/file1, но если вы не можете, вы можете иметь любую структуру, какую захотите, 2020/03/01/file1, year=2020/month=4/date=1/file1 или любая другая структура, в которой есть один отдельный префикс для даты, будет работать более или менее одинаково хорошо.

Я также предлагаю вам создавать таблицы только с одним столбцом раздела: date ( или dt или day, если вы хотите избежать цитирования), набираемый как DATE, а не строка.

То, что вы делаете затем вместо запуска MSCK REPAIR TABLE, это то, что вы используете ALTER TABLE … ADD PARTITION или Склейте API напрямую, чтобы добавить разделы. Эта команда позволяет вам указать местоположение отдельно от значения столбца раздела:

ALTER TABLE my_table ADD
PARTITION (day = '2020-04-01') LOCATION 's3://some-bucket/path/to/2020-04-01/'

Здесь важно то, что значение столбца раздела вообще не должно иметь никакого отношения к местоположению, это будет работать одинаково хорошо:

ALTER TABLE my_table ADD
PARTITION (day = '2020-04-01') LOCATION 's3://some-bucket/path/to/data-for-first-of-april/'

Для вашего конкретного случая c вы можете иметь:

PARTITIONED BY (`parent` string, `day` date)

и затем сделать:

ALTER TABLE your_table ADD
PARTITION (parent = '9ab4fcca-65d8-11ea-bc55-0242ac130003', day = '2020-04-17') LOCATION 's3://your-bucket/parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=17'
PARTITION (parent = '9ab4fcca-65d8-11ea-bc55-0242ac130003', day = '2020-04-09') LOCATION 's3://your-bucket/parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=9'
PARTITION (parent = '0fc966a0-bba7-4c0b-a648-cff7f0332059', day = '2020-04-16') LOCATION 's3://your-bucket/parent=0fc966a0-bba7-4c0b-a648-cff7f0332059/year=2020/month=4/date=16'
PARTITION (parent = '9ab4fcca-65d8-11ea-bc55-0242ac130003', day = '2020-04-14') LOCATION 's3://your-bucket/parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=14'
1 голос
/ 18 апреля 2020

Вот как вы можете использовать значения года, месяца и дня, полученные из разделов, для выбора диапазона дат

SELECT col1, col2
FROM my_table 
WHERE CAST(date_parse(concat(CAST(year AS VARCHAR(4)),'-',
                             CAST(month AS VARCHAR(2)),'-',
                             CAST(day AS VARCHAR(2))
                             ), '%Y-%m-%d') as DATE) 
BETWEEN DATE '2019-06-01' AND DATE '2020-04-31'

При необходимости вы можете добавить дополнительные операторы фильтра)

...