Партиционирование¶
Плагин 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.