Главная страница Новости кинофильмов Игровые новости Новости спорта Новости технологий Автомобильные новости

Как анализатор Node CSV может сэкономить ваши выходные

Новости

В прошлую пятницу, за час до того, как двери моего клиента закрылись на выходные, ко мне подошел коллега. Он только что закончил экспортировать 9 CSV-файлов из базы данных Oracle, которые он хотел импортировать в Greenplum, чтобы наш клиент мог начать тестирование в понедельник утром.

Выявленная проблема была довольно простой. Ему требовалось быстрое решение (менее часа, включая кодирование), чтобы преобразовать все даты в исходном CSV-файле в формат, подходящий для Greenplum. В то время как Oracle экспортировала даты в виде «ДД/ММ/ГГГГ», Greenplum был достаточно разборчив, чтобы ожидать даты в виде «ГГГГ-ММ-ДД».

Вот файлы, которые нам нужно было импортировать:

-rw-r—r- 1 ingres ingres 41G 2011-12-09 18:23 a.csv -rw-r-r- 1 ingres ingres 418M 2011-12-09 17:22 b.csv -rw-r-r- 1 ingres ingres 45G 2011-12-09 18:26 c.csv -rw-r-r- 1 ingres ingres 1,82011-12-09 17:37 дата публикации: 2011-12-09 17:37 дата публикации: 2011-12-09 17:33 дата публикации: 2011-12-09 17:33 дата публикации: 2011-12-09 17:13 дата публикации: 2011-12-09 17:13 дата публикации: 2011-12-09 18:09 g.csv -rw-r-r- 1 ingres ingres 621M 2011-12-09 17:33 h.csv -rw-r-r- 1 ingres ingres 3,1G 2011-12-09 17:46 i.csv

Среди этих файлов два имеют размер более 45 Гб.

Поскольку создание новых файлов, вероятно, заняло бы слишком много времени, первый заданный вопрос заключался в том, будет ли команда импорта Greenplum принимать стандартные данные по каналу unix, и, к счастью, на этот вопрос был дан положительный ответ. Итак, мое первое предложение состояло в том, чтобы обработать файл, передать его в Awk, который переформатировал бы дату построчно и, наконец, передал бы ее в инструмент импорта. Команда должна выглядеть следующим образом:

cat a.csv | awk ‘…’ | psql -p $port $database -c «СКОПИРОВАТЬ $table ИЗ STDIN С помощью CSV;»

Решение кажется выполнимым. Проблема в том, что мы не являемся экспертами в Awk, и я не мог гарантировать, что ему хватит часа, чтобы написать и протестировать команду.

Учитывая, насколько хорошо я знаком с Node в те дни, я сказал ему, что написать небольшой JavaScript-скрипт, который взаимодействует со стандартным вводом и stdout, было бы намного безопаснее. Именно тогда мы подумали об использовании CSV-анализатора, первой библиотеки, которую я написал для Node чуть больше года назад.

Сначала нам пришлось настроить прокси-сервер и установить Node на этот сервер, что заняло около 10 миллионов долларов. Для этого мы использовали NVM. Затем мы написали следующий JavaScript:

#!/usr/bin/env node var csv = require(‘./csv’); csv().FromStream(process.stdin).toStream(process.stdout).transform(функция(данные, индекс){ для(var i=0; i< data.length; i++) _BOS_ если(/(d{2})/(d{2})/(d{2})/.тест(данные[i])) _BOS_ данные[i] = данные[i].заменить(/(d{2})/(d{2})/(d{2})/, "20$3-$2-$1"); } } вернуть данные; }); обработать.stdin.resume()

Обратите внимание, как можно было бы оптимизировать использование регулярного выражения. Но нашей целью было не ускорить процесс импорта, а только запустить его как можно скорее.

В нашем распоряжении уже был небольшой скрипт на bash, который мог выполнять циклический переход по CSV-файлам и запускать команду импорта Greenplum. Мы немного подправили его, например, чтобы финальная версия выглядела так:

#!/bin/bash для csv в $(ls ~/export/*.csv) do table=`echo $csv|cut -d’/’ -f 5`; таблица=`echo $table|cut -d’.’ -f 1`; table=`echo $table| sed ‘s/(.*)../1/»; cat $csv | transform.js | psql -p 5433 my_database -c «СКОПИРОВАТЬ $table ИЗ СТАНДАРТНОГО ФАЙЛА В ФОРМАТЕ CSV;»сделано

Итак, в понедельник утром анализатор CSV обработал объем, и все файлы CSV были загружены в Greenplum.


Другие новости: