Python 最好的阅读方式是在一张大桌子的一部分涂上胶水

Python 最好的阅读方式是在一张大桌子的一部分涂上胶水,python,amazon-web-services,apache-spark,pyspark,aws-glue,Python,Amazon Web Services,Apache Spark,Pyspark,Aws Glue,我从我的数据湖(目前存储在postgres中)加载一个大文件到AWS GLUE时遇到了一些问题。这是43亿行 在测试中,我发现表太大,无法完全读取 下面是我加载数据帧的方式: large_dynamic_frame = glueContext.create_dynamic_frame.from_catalog(database = "DBNAME", table_name = "TABLENAME",

我从我的数据湖(目前存储在postgres中)加载一个大文件到AWS GLUE时遇到了一些问题。这是43亿行

在测试中,我发现表太大,无法完全读取

下面是我加载数据帧的方式:

large_dynamic_frame = glueContext.create_dynamic_frame.from_catalog(database = "DBNAME",
                                          table_name = "TABLENAME",
                                          redshift_tmp_dir = args["TempDir"],
                                          transformation_ctx = "TABLECTX")
重要因素

  • 我不需要整个数据帧!我最终将基于几个属性进行过滤,并使用较小的表进行连接

  • 我已经尝试过使用
    下推谓词
    ,但这需要使用特定的文件夹组织将数据存储在S3中,不幸的是,我无法选择此表的预先存在的格式

  • 我还尝试读取表中的内容,并简单地将其重新组织到S3文件夹组织中,这是
    pushdown\u predicate
    工作所必需的,但运行5小时后,该过程以“退出代码1”结束

主要问题


如何在不使用
下推谓词的情况下读取表的一部分

不幸的是,谓词下推只适用于S3,正如您已经发现的那样

  • 关于“退出代码1”,S3中的数据是否为原始CSV格式?您可以尝试创建多部件bzip2或lz4吗。在这种情况下,负载将由多个工作人员共享
  • 您为任务分配了多少DPU。这为DPU容量规划提供了一个很好的概述
  • 或者您可以在Postgres中创建一个视图并将其用作源

  • 如果有帮助,请告诉我。

    您也可以在Glue中使用纯spark/pyspark代码,并利用其读取方法。 您可以在他们的文档中看到,如何从SQL数据库或一般情况下通过SQL数据库进行读取。甚至从查询中读取数据,如以下示例所示:

    # Read data from a query
    df = spark.read \
      .format("com.databricks.spark.redshift") \
      .option("url", "jdbc:redshift://redshifthost:5439/database?user=username&password=pass") \
      .option("query", "select x, count(*) my_table group by x") \
      .option("tempdir", "s3n://path/for/temp/data") \
      .load()
    
    我发现AWS Glue只实现了spark功能的一小部分,所以当您有复杂的工作要做时,我建议您使用spark/pySpark