Skip to content

Чтение из Hive с использованием DBReader

DBReader поддерживает стратегии для инкрементального чтения данных, но не поддерживает пользовательские запросы, такие, например, включающие JOIN.

Поддерживаемые функции DBReader

  • ✅︎ columns
  • ✅︎ where
  • ✅︎ hwm, поддерживаемые стратегии:
  • ✅︎ Snapshot
  • ✅︎ Incremental
  • ✅︎ Snapshot batch
  • ✅︎ Incremental batch
  • hint (не поддерживается Hive)
  • df_schema
  • options (используются только параметры конфигурации Spark)

Предупреждение

Фактически, columns, where и hwm.expression должны быть написаны с использованием синтаксиса SparkSQL, а не HiveQL.

Примеры

Стратегия Snapshot:

```python
from onetl.connection import Hive
from onetl.db import DBReader

hive = Hive(...)

reader = DBReader(
    connection=hive,
    source="schema.table",
    columns=["id", "key", "CAST(value AS text) value", "updated_dt"],
    where="key = 'something'",
)
df = reader.run() 
```

Cтратегия Incremental:

```python
    from onetl.connection import Hive
    from onetl.db import DBReader
    from onetl.strategy import IncrementalStrategy

    hive = Hive(...)

    reader = DBReader(
        connection=hive,
        source="schema.table",
        columns=["id", "key", "CAST(value AS text) value", "updated_dt"],
        where="key = 'something'",
        hwm=DBReader.AutoDetectHWM(name="hive_hwm", expression="updated_dt"),
    )

    with IncrementalStrategy():
        df = reader.run()
```

Рекомендации

Используйте форматы записи на основе столбцов

Предпочтительны следующие форматы записи:

Для форматов записи на основе столбцов каждый файл содержит отдельные секции, где хранятся данные столбцов. Футер файла содержит информацию о расположении каждой секции/группы столбцов. Spark может использовать эту информацию для загрузки только тех секций, которые требуются для конкретного запроса, например, только выбранных столбцов, что значительно ускоряет выполнение запроса.

Еще одно преимущество — высокий коэффициент сжатия, например, в 10-100 раз по сравнению с JSON или CSV.

Выбирайте только необходимые столбцы

Вместо передачи "*" в DBReader(columns=[...]) предпочтительнее передавать точные имена столбцов. Это существенно уменьшает объем данных, считываемых Spark, если используются форматы файлов на основе столбцов.

Используйте столбцы секционирования в условии where

Запросы должны включать условие WHERE с фильтрами по столбцам секционирования Hive. Это позволяет Spark читать только небольшой набор файлов (отсечение секций) вместо сканирования всей таблицы, что значительно повышает производительность.

Поддерживаемые операторы: =, >, < и BETWEEN, и только в сравнении с некоторым статическим значением.