Создать CSV для таблицы с большим количеством данных - PullRequest
0 голосов
/ 29 июня 2018

У меня есть таблица в базе данных postgres (собственно, красное смещение AWS), данные из этой таблицы необходимо экспортировать в CSV после некоторых операций. В качестве примера, Рассмотрим таблицу Test, с колонками A, B, C, D.

Column A, Column B, Column C, Column D
ValueA1 , ValueB1 , ValueC1 , 1
ValueA1 , ValueB2 , ValueC2 , 2     

где A, B, C - строки, а D - целое число.

Запись в этой таблице означает, что для значения столбца A, столбца B, столбца C, D является счетчиком.

Отношение между A, B, C является иерархическим A> B> C.

Мое требование заключается в том, что CSV должен иметь данные, соответствующие операции накопления postgres. то есть, Пример CSV:

Column A, Column B, Column C, Sum(D)
ValueA1 ,         ,         ,  3
        , ValueB1  ,         , 1
        ,         , ValueC1 ,  1 
        , ValueB2  ,         , 2
        ,         , ValueC2 ,  2

В настоящее время мой подход состоит в том, чтобы группировать по A, B, C и получать сумму из столбца D. Иерархическая агрегация выполняется в приложении. Я не могу получить весь набор результатов (70 миллионов или около того) за один раз, но если бы я использовал лимит и смещение в postgres, чтобы получить данные в разбивке по страницам, есть вероятность, что я мог бы в конечном итоге разделить иерархические данные, ведущие к ValueA был замечен дважды (или больше) в CSV.

Приложение построено с использованием Java и JOOQ. Данные отправляются во внешний интерфейс (построенный с использованием реагирования), и там записывается CSV.

Любая помощь относительно того, как сделать это CSV, приветствуется.

1 Ответ

0 голосов
/ 29 июня 2018

Если я правильно понимаю, вы хотели бы убедиться, что каждый раз, когда вы отправляете кусок данных, этот блок должен содержать ВСЕ строки для любого заданного значения столбца A (который присутствует в блоке). Вы можете использовать функцию DENSE_RANK, как показано ниже -

SELECT *
FROM (
       SELECT
         ColumnA,
         ColumnB,
         ColumnC,
         dense_rank()
         OVER (
           ORDER BY ColumnA ASC ) AS dr,
         sum(ColumnD)             AS sumD
       FROM SomeTable
       GROUP BY ColumnA,
         ColumnB,
         ColumnC) AS sub_table
WHERE sub_table.dr BETWEEN 1 AND 5

В последнем условии вы можете указать желаемый диапазон номеров записей в чанке (dens_rank () будет увеличиваться при каждом изменении значения ColumnA)

Вы можете сослаться на - https://docs.aws.amazon.com/redshift/latest/dg/r_WF_DENSE_RANK.html https://docs.aws.amazon.com/redshift/latest/dg/r_Examples_of_dense_rank_WF.html

...