Функции модуля Python tngri

Для удобной работы с данными в ячейках типа Python создан модуль tngri. В нем доступны функции, описанные на этой странице.

Функции модуля tngri доступны только в ячейках типа Python и для их работы необходимо импортировать модуль: import tngri.

tngri.sql()

Описание

Выполняет указанный запрос SQL внутри ячейки типа Python.

Использование

tngri.sql('<SQL_query>')

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

Один из сценариев использования описан здесь.

Посмотреть примеры

Пример 1

Создадим таблицу с именем из переменной table_name и запишем в нее в цикле:

  • индекс (начиная с 1)

  • слово из фразы, заданной в переменной test_phrase

  • результат применения к этому слову заданной функции length_in_chars

В каждой итерации цикла будем выводить значение индекса, добавленное слово и результат запроса SQL с текущим количеством строк в создаваемой таблице.

import tngri

def length_in_chars(text):
    if len(text) == 1:
        return '1 character'
    else:
        return f'{len(text)} characters'

table_name = 'my_table'
test_phrase = 'I love Tengri'

tngri.sql(f'CREATE OR REPLACE TABLE {table_name} \
          (index INT, word VARCHAR, length VARCHAR)'
         )

ind = 0
for word in test_phrase.split(' '):
    ind += 1
    tngri.sql(f"INSERT INTO {table_name} VALUES \
              ({ind}, '{word}', '{length_in_chars(word)}')"
             )
    print(f'Added word: "{word}"')
    print(tngri.sql(f'SELECT count(*) FROM {table_name}'))
Step: 1
Added word: "I"
shape: (1, 1)
+----------+
│ column_0 │
│ ---      │
│ i64      │
+----------+
│ 1        │
+----------+
Step: 2
Added word: "love"
shape: (1, 1)
+----------+
│ column_0 │
│ ---      │
│ i64      │
+----------+
│ 2        │
+----------+
Step: 3
Added word: "Tengri"
shape: (1, 1)
+----------+
│ column_0 │
│ ---      │
│ i64      │
+----------+
│ 3        │
+----------+

Теперь в ячейке типа SQL выведем созданную таблицу, упорядочив ее по индексу:

SELECT * FROM my_table
    ORDER BY index
+-------+--------+--------------+
| index | word   | length       |
+-------+--------+--------------+
| 1     | I      | 1 character  |
+-------+--------+--------------+
| 2     | love   | 4 characters |
+-------+--------+--------------+
| 3     | Tengri | 6 characters |
+-------+--------+--------------+

Пример 2

Выполним итеративную загрузку данных из файлов .parquet из хранилища S3 в таблицу по маске путей к файлам.

В каждой итерации цикла будем выводить результат запроса с количеством строк в создаваемой таблице.

import tngri

for i in range(1,4):
    file_name = f"s3://prostore/Stage/<lake_path>/{i}.parquet"
    tngri.sql(f"INSERT INTO raw.dyntest SELECT * FROM read_parquet('{file_name}')")
    print(tngri.sql("SELECT count(*) FROM raw.dyntest"))
shape: (1, 1)
+----------+
│ column_0 │
│ ---      │
│ i64      │
+----------+
│ 10000000 │
+----------+
shape: (1, 1)
+----------+
│ column_0 │
│ ---      │
│ i64      │
+----------+
│ 20000000 │
+----------+
shape: (1, 1)
+----------+
│ column_0 │
│ ---      │
│ i64      │
+----------+
│ 30000000 │
+----------+

tngri.upload_df()

Описание

Загружает данные из DataFrame в Tengri.

Использование

tngri.upload_df(DataFrame)

Загружает данные из указанного DataFrame в Tengri (в хранилище S3).
Возвращает строку с именем файла .parquet, в который были загружены данные.

Подробнее загрузка данных в Tengri с помощью Python описана здесь.

Посмотреть примеры
  • Создадим DataFrame, и загрузим его в Tengri:

    import tngri
    import pandas
    
    my_df = pandas.DataFrame(range(100))
    
    tngri.upload_df(my_df)
    UploadedFile(s3_path='s3://prostore/Stage/ijwsajclddxw.parquet', _client=None)
  • Создадим DataFrame, загрузим его в Tengri и запишем имя файла .parquet в переменную file_name:

    import tngri
    import pandas
    
    my_df = pandas.DataFrame(range(100))
    file_name = tngri.upload_df(my_df)
    
    print(my_df)
    print(file_name)
    0
    0    0
    1    1
    2    2
    3    3
    4    4
    ..  ..
    95  95
    96  96
    97  97
    98  98
    99  99
    
    [100 rows x 1 columns]
    tdiiuetablyx.parquet

tngri.upload_file()

Описание

Загружает данные из файла в Tengri.

Использование

tngri.upload_file(FilePath[, FileName])

  • FilePath — путь к файлу, который нужно загрузить в Tengri

  • FileName — имя для файла в Tengri

Загружает данные из файла по указанному пути в Tengri (в хранилище S3).
Возвращает строку с путем и именем файла внутри хранилища S3, в который были загружены данные.

Один из сценариев использования описан здесь.

Посмотреть примеры
  • Загрузим в Tengri данные из файла .json, доступного по URL:

    import tngri
    import urllib.request
    
    urllib.request.urlretrieve(
        'https://tngri.postgrespro.ru/documentation/ru/stable/_attachments/tengri_data_types.json',
        'my_file.json'
        )
    
    tngri.upload_file('my_file.json')
    UploadedFile(s3_path='s3://prostore/Stage/pxfihzbonctd.json', _client=None)

    Выведем первые 5 строк таблицы, прочитав ее из загруженного файла:

    SELECT * FROM read_json("pxfihzbonctd.json")
        LIMIT 5
    +----------+-----------+----------+---------------------------+
    | name     | type      | category | description               |
    +----------+-----------+----------+---------------------------+
    | BIGINT   | data type | numeric  | Целые числа.              |
    +----------+-----------+----------+---------------------------+
    | BIGINT[] | data type | array    | Массивы целых чисел.      |
    +----------+-----------+----------+---------------------------+
    | BLOB     | data type | blob     | Двоичные объекты.         |
    +----------+-----------+----------+---------------------------+
    | BOOL     | data type | boolean  | Булевы значения.          |
    +----------+-----------+----------+---------------------------+
    | BOOL[]   | data type | array    | Массивы булевых значений. |
    +----------+-----------+----------+---------------------------+
  • Загрузим в Tengri данные из файла .json, доступного по URL, и сохраним имя загруженного файла в переменную:

    import tngri
    import urllib.request
    
    urllib.request.urlretrieve(
        'https://tngri.postgrespro.ru/documentation/ru/stable/_attachments/tengri_data_types.json',
        'my_file.json'
        )
    
    file_name = tngri.upload_file('my_file.json')
    print(file_name)
    pxfihzbonctd.json

    Выведем первые 5 строк таблицы, прочитав ее из загруженного файла:

    SELECT * FROM read_json("pxfihzbonctd.json")
        LIMIT 5
    +----------+-----------+----------+---------------------------+
    | name     | type      | category | description               |
    +----------+-----------+----------+---------------------------+
    | BIGINT   | data type | numeric  | Целые числа.              |
    +----------+-----------+----------+---------------------------+
    | BIGINT[] | data type | array    | Массивы целых чисел.      |
    +----------+-----------+----------+---------------------------+
    | BLOB     | data type | blob     | Двоичные объекты.         |
    +----------+-----------+----------+---------------------------+
    | BOOL     | data type | boolean  | Булевы значения.          |
    +----------+-----------+----------+---------------------------+
    | BOOL[]   | data type | array    | Массивы булевых значений. |
    +----------+-----------+----------+---------------------------+

tngri.upload_s3()

Описание

Загружает файл из указанного бакета S3 в Tengri.

Использование

tngri.upload_s3(
    object = 's3://<file_path>.parquet',
    access_key = '<access_key>',
    secret_key = '<secret_key>',
    [filename = '<new_name>.parquet']
    )

  • object — путь к файлу в хранилище S3.

  • access_key — ключ доступа для S3.

  • secret_key — секретный ключ для S3.

Расширение файла при этом может быть любым. Оно останется тем же, каким оно было в начальном файле. При необходимости для загружаемого файла можно задать путь и имя через опциональный параметр filename.

Пример использования описан здесь.