Pyspark 如何将csv/txt文件加载到AWS粘合作业中

Pyspark 如何将csv/txt文件加载到AWS粘合作业中,pyspark,aws-glue,Pyspark,Aws Glue,我有以下2个关于AWS胶水的澄清,你能澄清一下吗。因为我需要使用胶水作为我项目的一部分 我想加载一个csv/txt文件到一个胶水作业来处理它。(就像我们在Spark中使用数据帧一样)。用胶水可以吗?或者我们必须只使用爬虫将数据爬网到粘合表中,并像下面那样使用它们进行进一步处理吗 empdf = glueContext.create_dynamic_frame.from_catalog( database="emp", table_name="emp_json") 下面我使用S

我有以下2个关于AWS胶水的澄清,你能澄清一下吗。因为我需要使用胶水作为我项目的一部分

  • 我想加载一个csv/txt文件到一个胶水作业来处理它。(就像我们在Spark中使用数据帧一样)。用胶水可以吗?或者我们必须只使用爬虫将数据爬网到粘合表中,并像下面那样使用它们进行进一步处理吗

    empdf = glueContext.create_dynamic_frame.from_catalog(
        database="emp",
        table_name="emp_json")
    
  • 下面我使用Spark代码将一个文件加载到Glue中,但我得到了很长的错误日志。我们是否可以直接运行Spark或PySpark代码,而不改变胶水

    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)
    

  • 可以使用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(正如您已经尝试过的那样)来实现这一点:


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

    以下2种情况我测试正常:

    将文件从S3加载到Glue中。 从Glue db和已经通过Glue爬虫生成的表加载数据。 DynFr是一个动态框架,所以如果我们想在Glue中使用Spark代码,那么我们需要将其转换为如下所示的正常数据框架。
    只需更改上述内容,将其作为PySpark代码的一部分使用,但我得到:SyntaxError:无效语法,我需要它来支持PySpark
    sourceDf = spark.read
        .option("header","true")
        .option("delimiter", ",")
        .csv("C:\inputs\TEST.txt") 
    
    dfnew = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://MyBucket/path/"] }, format="csv" )
    
    dfnew.show(2)
    
    DynFr = glueContext.create_dynamic_frame.from_catalog(database="test_db", table_name="test_table")
    
    df1 = DynFr.toDF()