在 aws 中将 1,620 列转换为 360gb 文本文件中的行

Posted

技术标签:

【中文标题】在 aws 中将 1,620 列转换为 360gb 文本文件中的行【英文标题】:Pivoting 1,620 columns to rows in 360gb text file in aws 【发布时间】:2017-10-20 21:36:48 【问题描述】:

我有一个 360GB 的管道分隔文本文件,压缩 (gzip)。 它有超过 1,620 列。我无法显示确切的字段名称,但基本上是这样的:

primary_key|property1_name|property1_value|property800_name|property800_value
12345|is_male|1|is_college_educated|1

说真的,这些属性名称/值字段有 800 多个。 大约有 2.8 亿行。 该文件位于 S3 存储桶中。 我需要将数据导入 Redshift,但 Redshift 中的列限制为 1,600。

用户希望我对数据进行透视。例如:

primary_key|key|value
12345|is_male|1
12345|is_college_educated|1

在 aws 环境中旋转文件的好方法是什么?数据在一个文件中,但我计划将数据拆分为许多不同的文件以允许并行处理。

我考虑过使用 Athena。我找不到任何说明 Athena 允许的最大列数的内容。但是,我发现了一个关于 Presto(Athena 的基础)的页面,上面写着“没有确切的硬限制,但我们已经看到超过几千的东西打破了。” (https://groups.google.com/forum/#!topic/presto-users/7tv8l6MsbzI)。

谢谢。

【问题讨论】:

【参考方案1】:

首先,旋转您的数据,然后加载到 Redshift。

更详细的步骤是:

    运行一个 Spark 作业(使用 EMR 或可能使用 AWS Glue),它会读取您的 源 S3 数据并写出(到不同的 s3 文件夹)一个旋转的 版本。我的意思是如果你有 800 个值对,那么你会 写出 800 行。同时,您可以将文件拆分为多个部分以启用并行加载。 “复制”这个数据到 Redshift 中

【讨论】:

【参考方案2】:

我从 AWS 中学到的大部分时间是,如果您达到了限制,那么您就是在以错误的方式进行操作,或者以不可扩展的方式进行操作。大多数时候,架构师在设计时考虑了可扩展性和性能。

我们有类似的问题,有 2000 列。以下是我们解决它的方法。

    将文件拆分为 20 个不同的表,每个表有 100+1(主键)列。 在单个查询中对所有这些表进行选择,以返回所需的所有数据。 如果您说要查看一个选择中的所有 1600 列,那么业务用户正在查看错误的列以进行分析甚至机器学习。

为了加载 10TB 以上的数据,我们将数据拆分为多个文件并并行加载,这样加载速度更快。

在 Athena 和 Redshift 之间,性能是唯一的区别。其余的都是一样的。 Redshift 的表现优于 Athena。初始加载时间和扫描时间高于 Redshift。

希望对你有帮助。

【讨论】:

以上是关于在 aws 中将 1,620 列转换为 360gb 文本文件中的行的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript:在AWS Lambda Node应用程序中将RSS转换为JSON

sh 在PLINK中将2列转换为1列可能性

在 Numpy 中将行向量转换为列向量

如何在presto中将列转换为数组

在 BigQuery 中将列转换为数组

在 MATLAB 中将列号转换为小时