【问题标题】:Generate CSV for table with a lot of data为包含大量数据的表生成 CSV
【发布时间】:2018-06-29 11:08:29
【问题描述】:

我在 postgres 数据库中有一个表(实际上是 AWS redshift),该表中的数据需要经过一些操作后导出为 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 rollup 操作的数据。 IE, CSV 示例:

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

目前,我的方法是对 A、B、C 进行分组并获得 D 列的总和。应用程序中正在进行分层聚合。 我无法一次获得全部结果(7000 万左右),但如果我在 postgres 中使用 limit 和 offset 以分页方式获取数据,我可能最终会拆分导致 ValueA 的分层数据在 CSV 中出现过两次(或更多次)。

应用程序是使用 Java 和 JOOQ 构建的。数据被发送到前端(使用 react 构建)并在那里写入 CSV。

感谢有关如何完成此 CSV 的任何帮助。

【问题讨论】:

    标签: java postgresql csv bigdata amazon-redshift


    【解决方案1】:

    如果我理解正确,您希望确保每次发送数据块时,该块必须包含 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
    

    在最后一个条件中,您可以在一个块中提供您想要的记录编号范围(每次更改 ColumnA 的值时,dense_rank() 都会增加)

    你可以参考—— 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

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2017-07-07
      • 2020-02-09
      • 1970-01-01
      相关资源
      最近更新 更多