JOOQ codegen: есть ли способ читать файлы паркета с помощью диалекта DuckDB?

Как сказано в заголовке, существует ли обходной путь с jOOQ, который позволил бы мне использовать DuckDB для запроса файлов паркета, хранящихся в объектном хранилище? Пример: read_parquet(s3://path/to/my/parquet_file)

У меня есть схема файлов паркета, которую я определил в скрипте для создания классов jOOQ.

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

Есть ли лучший способ сделать это, используя автоматически сгенерированные классы?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предположительно, jOOQ 3.19 поддерживает DuckDB: https://www.jooq.org/doc/latest/manual/reference/supported-rdbms/

Это должно означать, что вам понадобятся только расширение httpfs DuckDB и, конечно же, необходимые разрешения.

Подробности смотрите https://duckdb.org/docs/guides/network_cloud_storage/s3_import.html, но вкратце:

import httpfs; -- need only be done once (per user per machine)
load https;
# set up the credentials and S3 region to read data
SELECT * FROM read_parquet('s3://⟨bucket⟩/⟨file⟩');

Спасибо за ответ, но я не думаю, что вы поняли мой вопрос. Я ищу способ сделать это через jOOQ (особенно, когда у меня есть автоматически сгенерированные классы таблиц). Я знаю, что это способ сделать это напрямую в DuckDB.

Humaid Kidwai 03.08.2024 06:04
Ответ принят как подходящий

Использование представлений

jOOQ ничего не знает об этих динамических внешних таблицах. Но вы, возможно, создадите представление, которое считывает из файла паркета и вместо этого запрашивает это представление, предполагая, что DuckDB может обнаружить метаданные паркета при описании представления для jOOQ, используя его представления INFORMATION_SCHEMA.

Использование сопоставления схемы

Другой подход — создать фиктивную таблицу (или представление), описывающую файл паркета, а затем использовать сопоставление схемы времени выполнения для сопоставления фиктивной таблицы с вызовом функции. При этом обязательно отключите кавычки идентификаторов, иначе весь вызов функции будет заключен в кавычки.

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

Фиктивная таблица даже не обязательно должна существовать в вашей схеме. Вы можете определить второй запуск генерации кода, который использует DDLDatabase только для этого:

<configuration>
  <generator>
    <database>
      <name>org.jooq.meta.extensions.ddl.DDLDatabase</name>
      <properties>
        <property>
          <key>sql</key>
          <value>create table dummy (col1 int, col2 int);</value>
        </property>
      </properties>
    </database>
  </generator>
</configuration>

Обычный шаблон SQL

Конечно, генерация кода с помощью jOOQ действительно полезна, но если ничего не помогает, простые шаблоны SQL здесь являются прагматичным решением. Вы все равно можете комбинировать этот подход с приведенной выше фиктивной таблицей, если присвоите псевдоним простого шаблона SQL фиктивной таблице.

Другие вопросы по теме