我有大量具有不同模式的PostgreSQL表,并且其中包含大量数据。
我现在无法进行数据分析,因为数据量很大-数TB的数据,PostgreSQL无法在合理的时间内处理查询。
我正在考虑以下方法-我将使用Apache Spark处理所有PostgreSQL表,加载DataFrame并将其存储为AWS S3中的Parquet文件。然后,我将使用RedShift Spectrum来查询存储在这些PARQUET文件中的信息。
首先,我想问一下-此解决方案是否可以工作?
第二个-RedShift Spectrum是否能够在没有其他架构规范的情况下自动从这些Parquet文件创建EXTERNAL表(即使原始PostgreSQL表包含AWS RedShift不支持的数据类型)?
答案 0 :(得分:1)
Redshift Spectrum几乎支持与Redshift本身相同的数据类型。
Redshift Spectrum在后台创建了计算节点的群集。群集的大小基于实际的Redshift群集节点数,因此,如果您计划创建1个节点Redshift群集,Spectrum的运行速度将非常慢。
正如您在评论中指出的那样,您可以使用Athena来查询数据,对于您的情况,这将是更好的选择,而不是Spectrum。但是Athena有一些局限性,例如30分钟的运行时间,内存消耗等。因此,如果您打算使用多个联接进行复杂的查询,那将是行不通的。
如果没有提供的结构,Redshift Spectrum无法创建外部表。
在您的情况下,最好的解决方案是使用Spark(在EMR或Glue上)转换数据,然后由Athena进行查询,如果Athena无法执行特定的查询,请对同一数据使用SparkSQL。您可以使用Glue,但在竞价型实例上的EMR上运行作业将更灵活,更便宜。 EMRFS附带了EMR群集,它使您能够几乎透明地使用S3而不是HDFS。
答案 1 :(得分:0)
AWS Glue作为一个选项可能会很有趣。它既是Spark的托管版本,带有一些AWS特定的附加组件,又是Data Crawler + Data Catalogue。
它可以抓取非结构化数据(例如Parquet文件)并找出结构。然后,您可以根据需要将其以结构化形式导出到AWS RedShift。
有关如何使用JDBC将数据从Postgres移至S3的信息,请参见this blog post。