Партиционирование

Плагин PXF JDBC поддерживает одновременный доступ к внешней таблице на чтение из нескольких узлов PXF. Такая функция называется партиционированием.

Синтаксис

Для активации партиционирования необходимо использовать следующие параметры <plugin_parameters>:

&PARTITION_BY=<column>:<column_type>
&RANGE=<start_value>:<end_value>
[&INTERVAL=<value>[:<unit>]]

Параметр PARTITION_BY указывает, какой столбец используется в качестве столбца партиционирования (можно использовать только один столбец):

  • <column> – имя столбца, по которому производится партиционирование;
  • <column_type> – тип данных столбца <column>. Поддерживаемые типы: INT, DATE и ENUM.

Параметр RANGE указывает диапазон данных для запроса:

  • Если тип партиционирования – ENUM, параметр RANGE должен быть списком значений, каждое из которых формирует собственную партицию;
  • Если тип партиционирования – INT или DATE, параметр RANGE должен быть конечным замкнутым слева диапазоном (… >= start_value AND … < end_value);
  • Для типа партиционирования DATE формат даты должен быть yyyy-MM-dd.

Параметр INTERVAL необходим для партиционирований типа INT и DATE и игнорируется в случае, если <column_type> является ENUM:

  • <value> – размер каждой партиции (если данное значение не кратно параметру RANGE, последняя партиция будет меньшего размера);
  • <unit> должен быть указан, если тип <column_type> является DATE, и допустимые значения – year, month и day. Параметр игнорируется для других типов данных столбца партиции.

Примеры выражений, задающих параметры партиционирования:

&PARTITION_BY=id:int&RANGE=42:142&INTERVAL=2
&PARTITION_BY=createdate:date&RANGE=2008-01-01:2010-01-01&INTERVAL=1:month
&PARTITION_BY=grade:enum&RANGE=excellent:good:general:bad

Механизм работы

При активированном партиционировании запрос SELECT разбивается на набор отдельных запросов, каждый из которых называется партицией (или фрагментом). Все фрагменты одновременно обрабатываются отдельными инстансами PXF. В случае превышения числа фрагментов над числом инстансов PXF, некоторые инстансы обрабатывают более одного фрагмента (по очереди); а в случае только одного инстанса PXF, все фрагменты обрабатываются им. Распределение фрагментов по инстансам происходит в процессе исполнения запроса.

Дополнительно к каждому фрагменту автоматически добавляются параметры запроса (с выражением WHERE) для гарантии, что каждый набор данных извлекается из внешнего источника ровно один раз.

Пример партиционирования

В качестве примера дана следующая таблица MySQL:

CREATE TABLE sales (
    id int primary key,
    cdate date,
    amt decimal(10,2),
    grade varchar(30)
)

И внешняя таблица ADB:

CREATE EXTERNAL TABLE sales(
    id integer,
    cdate date,
    amt float8,
    grade text
)
LOCATION ('pxf://sales?PROFILE=JDBC&JDBC_DRIVER=com.mysql.jdbc.Driver&DB_URL=jdbc:mysql://192.168.200.6:3306/demodb&PARTITION_BY=cdate:date&RANGE=2008-01-01:2010-01-01&INTERVAL=1:year')
FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');

На основе приведенных таблиц плагин PXF JDBC генерирует два фрагмента для запроса “SELECT * FROM sales”. Затем HAWQ назначает каждый из них отдельному узлу PXF. Каждый узел выполняет запрос SELECT, первый получает записи с значениями cdate за 2008 год, а второй – за 2009 год. Затем каждый узел PXF отправляет свои результаты обратно в HAWQ, где они “сцепляются” и возвращаются в ADB.