Перейти к основному содержимому

Загрузка данных из QVD, частичная

· 3 мин. чтения
Stanislav Chernov
owner and maintainer chernovdev.ru

Описание

Иногда в разработке приходится быстро проверять некоторые гипотезы на больших объемах данных, давайте объем данных представим в виде 100 000 000 строк в 1 QVD-файле.

Как долго будет грузиться такой объём данных? В зависимости от количества полей, условий загрузки, расчётов каких либо - долго, может даже минуты.

Предлагаю несколько вариантов загрузки данных, которые можно использовать исходя из ваших текущих задач, поехали!

Вариант 1. FIRST

Самый простой способ, это использование префикса перед словом LOAD, например:

FIRST 100
LOAD ...

Такая конструкция кода загрузит нам первые 100 строк из QVD файла, на самом деле не только из QVD, но и из любого другого источника, будь то excel, csv, базы данных и прочие.

Вариант 2. RAND()

Способ, который мне не очень нравится, тем не менее имеет место, это использование случайного числа в условиях загрузки:

LOAD
Моё_Поле1
, Моё_Поле2
FROM ...
WHERE
RAND() < 0.01

В данном случае, у нас при загрузке каждой строки из источника, будет генерироваться случайно число от 0 до 1, и будет производиться проверка его на условие, что оно меньше числа 0.01, т.е. 1%. Еще раз, RAND() генерирует число от 0 до 1, где 0 - это 0%, а 1 = 100% а в условии мы проверяем значение на 0.01, что является 1% от данного случайного числа.

Аналогичным образом можно заменить 0.01 на 0.1 и мы получим 10% данных.

Но! Вы практически никогда не сможете загрузить точный процент данных из источника, всегда у вас будет плавающее значение загружаемых данных, при попытке загрузить 10% - в итоге вы можете получить 2% данных, или 15%. Всё зависит от генератора случайных чисел и это нужно учитывать.

Вариант 3. SAMPLE

Префиксный оператор SAMPLE, работает аналогично оператору RAND() в условии, всё так же, с погрешностями, пример использования:

SAMPLE 0.01
LOAD ...
FROM ...

Вариант 4. FIRST, выдай нам 1% строк. Только QVD

Лично для меня самый правильный вариант использования части данных и чуть более сложный, чем все остальные.

Первым делом читаем наш QVD файл, а именно его метаданные, и смотрим сколько строк у нас имеется внутри файла, и лишь затем, полученный результат делим на нужный нам объем, и используем префикс FIRST, смотрим:

// Просто запишем путь к нашему файлу в переменную
SET vFileToLoad = 'lib://qvd2/allkeys (2).qvd';

// Загружаем количество строк из XML метаданных QVD файла
NOCONCATENATE
_temp_rec:
LOAD
NoOfRecords
FROM [$(vFileToLoad)]
(XmlSimple, table is QvdTableHeader);

// Записываем в переменную количество строк из файла, и сразу считаем, сколько строк нам нужно загрузить
// PEEK('NoOfRecords') - читаем значение из переменной
// умножаем на нужный процент, например 0.1 = 10%
// округляем FLOOR()
LET vRecordsCountToLoad = FLOOR(PEEK('NoOfRecords') * 0.1);
// Удаляем временную таблицу
DROP TABLE _temp_rec;

// Загружаем нужное нам количество строк из файла (примечание: грузятся только первые строки)

NOCONCATENATE
FIRST $(vRecordsCountToLoad)
LOAD ...
FROM [$(vFileToLoad)](qvd);

// очищаем переменные
SET vFileToLoad;
SET vRecordsCountToLoad;

А какие вы используете варианты?

Поделитесь со мной в telegram, и я дополню статью с публикацией на канале