diff --git a/docker-compose.yml b/docker-compose.yml index 45ebafe..4cff3d9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -56,8 +56,9 @@ services: - "${GP_PORT}:5432" volumes: - ./sql:/sql:ro - - ./pxf/postgresql-42.7.3.jar:/data/pxf/lib/postgresql-jdbc.jar:ro - - ./pxf/servers/bookings-db/jdbc-site.xml:/data/pxf/servers/bookings-db/jdbc-site.xml:ro + - ./pxf/postgresql-42.7.3.jar:/pxf-local/postgresql-42.7.3.jar:ro + - ./pxf/servers/bookings-db:/pxf-local/servers/bookings-db:ro + - ./pxf/init/10_pxf_bookings.sh:/docker-entrypoint-initdb.d/10_pxf_bookings.sh:ro - greenplum_data:/data - airflow_data:/opt/airflow/data # Простая проверка доступности: psql откликается diff --git a/pxf/init/10_pxf_bookings.sh b/pxf/init/10_pxf_bookings.sh new file mode 100755 index 0000000..a51c4d2 --- /dev/null +++ b/pxf/init/10_pxf_bookings.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# Простой init-скрипт для настройки PXF: +# - кладёт JDBC-драйвер PostgreSQL в каталог PXF; +# - копирует jdbc-site.xml для сервера bookings-db; +# - выполняет pxf cluster sync. +# Скрипт выполняется только при первой инициализации Greenplum (пустой /data). + +set -euo pipefail + +GREENPLUM_USER=${GREENPLUM_USER:-gpadmin} +PXF_BASE_DEFAULT="${GREENPLUM_DATA_DIRECTORY:-/data}/pxf" + +# Пробуем подтянуть PXF_BASE из .bashrc пользователя Greenplum +if [ -f "/home/${GREENPLUM_USER}/.bashrc" ]; then + # shellcheck disable=SC1090 + source "/home/${GREENPLUM_USER}/.bashrc" +fi + +PXF_BASE=${PXF_BASE:-$PXF_BASE_DEFAULT} + +mkdir -p "${PXF_BASE}/lib" "${PXF_BASE}/servers/bookings-db" + +# Копируем JAR-драйвер, если он ещё не установлен +if [ -f /pxf-local/postgresql-42.7.3.jar ] && [ ! -f "${PXF_BASE}/lib/postgresql-jdbc.jar" ]; then + cp /pxf-local/postgresql-42.7.3.jar "${PXF_BASE}/lib/postgresql-jdbc.jar" +fi + +# Копируем jdbc-site.xml для сервера bookings-db, если его нет +if [ -f /pxf-local/servers/bookings-db/jdbc-site.xml ] && [ ! -f "${PXF_BASE}/servers/bookings-db/jdbc-site.xml" ]; then + cp /pxf-local/servers/bookings-db/jdbc-site.xml "${PXF_BASE}/servers/bookings-db/jdbc-site.xml" +fi + +# Синхронизируем конфигурацию PXF (на всякий случай) +if command -v pxf >/dev/null 2>&1; then + pxf cluster sync || true +fi + diff --git a/sql/ddl_gp.sql b/sql/ddl_gp.sql index b0ae2bf..2788c57 100644 --- a/sql/ddl_gp.sql +++ b/sql/ddl_gp.sql @@ -13,9 +13,10 @@ DISTRIBUTED BY (order_id); -- Внешняя таблица для чтения данных из демо-БД bookings через PXF (JDBC). -- Источник: таблица bookings.bookings в базе demo (Postgres, сервис bookings-db). -CREATE EXTERNAL TABLE IF NOT EXISTS public.ext_bookings_bookings ( +DROP EXTERNAL TABLE IF EXISTS public.ext_bookings_bookings; +CREATE EXTERNAL TABLE public.ext_bookings_bookings ( book_ref CHAR(6), - book_date TIMESTAMP WITH TIME ZONE, + book_date TIMESTAMP, total_amount NUMERIC(10,2) ) LOCATION ('pxf://bookings.bookings?PROFILE=JDBC&SERVER=bookings-db')