【问题标题】:How to load a csv/txt file into AWS Glue job如何将 csv/txt 文件加载到 AWS Glue 作业中
【发布时间】:2018-10-20 10:07:46
【问题描述】:

我对 AWS Glue 有以下 2 项说明,请您说明一下。因为我需要在项目中使用胶水。

  1. 我想将 csv/txt 文件加载到 Glue 作业中进行处理。 (就像我们在 Spark 中使用数据帧所做的那样)。这在 Glue 中可能吗?还是我们只需要使用 Crawler 将数据抓取到 Glue 表中,然后像下面这样使用它们进行进一步处理?

    empdf = glueContext.create_dynamic_frame.from_catalog(
        database="emp",
        table_name="emp_json")
    
  2. 下面我使用 Spark 代码将文件加载到 Glue 中,但我收到了冗长的错误日志。我们可以直接运行 Spark 或 PySpark 代码而不需要对 Glue 进行任何更改吗?

    import sys
    from pyspark.context import SparkContext
    from awsglue.context import GlueContext
    
    sc = SparkContext()
    glueContext = GlueContext(sc)
    spark = glueContext.spark_session
    job = Job(glueContext)
    job.init(args['JOB_NAME'], args)
    dfnew = spark.read.option("header","true").option("delimiter", ",").csv("C:\inputs\TEST.txt")
    dfnew.show(2)
    

【问题讨论】:

    标签: pyspark aws-glue


    【解决方案1】:

    可以使用 Glue 直接从 s3 加载数据:

    sourceDyf = glueContext.create_dynamic_frame_from_options(
        connection_type="s3",
        format="csv",
        connection_options={
            "paths": ["s3://bucket/folder"]
        },
        format_options={
            "withHeader": True,
            "separator": ","
        })
    

    您也可以只使用 spark 来做到这一点(正如您已经尝试过的那样):

    sourceDf = spark.read
        .option("header","true")
        .option("delimiter", ",")
        .csv("C:\inputs\TEST.txt") 
    

    但是,在这种情况下,Glue 不保证它们会提供适当的 Spark 阅读器。因此,如果您的错误与缺少 CSV 数据源有关,那么您应该将 spark-csv lib 添加到 Glue 作业中,方法是通过 --extra-jars 参数提供指向其位置的 s3 路径。

    【讨论】:

    • 只需更改上述内容,将其用作 PySpark 代码的一部分,但我得到:SyntaxError: invalid syntax I need it for Pyspark
    【解决方案2】:

    以下 2 个案例我测试工作正常:

    将文件从 S3 加载到 Glue。

    dfnew = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://MyBucket/path/"] }, format="csv" )
    
    dfnew.show(2)
    

    从已通过 Glue Crawlers 生成的 Glue db 和表加载数据。

    DynFr = glueContext.create_dynamic_frame.from_catalog(database="test_db", table_name="test_table")
    

    DynFr 是一个 DynamicFrame,所以如果我们想在 Glue 中使用 Spark 代码,那么我们需要将其转换为如下所示的普通数据帧。

    df1 = DynFr.toDF()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多