附加到镶木地板文件的EMR Spark步骤是覆盖镶木地板文件

时间:2019-07-10 12:31:45

标签: python apache-spark amazon-emr parquet

使用Python 3.6的Amazon EMR集群(1个主节点,2个节点)上的Spark 2.4.2

我正在读取Amazon s3中的对象,将它们压缩为实木复合地板格式,并将其添加(附加)到现有的实木复合地板数据存储中。当我在pyspark shell中运行代码时,我能够读取/压缩对象并将新的镶木地板文件添加到现有的镶木地板文件中,并且当我对镶木地板数据运行查询时,它表明所有数据都在实木复合地板文件夹。但是,当我在EMR群集上一步运行代码时,现有的镶木地板文件被新文件覆盖。相同的查询将显示仅存在新数据,并且具有实木复合地板数据的s3文件夹仅具有新数据。

这是该步骤的关键代码:

    spark = SparkSession.builder \
                        .appName("myApp") \
                        .getOrCreate()

    df_p = spark.read \
                .format('parquet') \
                .load(parquet_folder)

    the_schema = df_p.schema

    df2 = spark.read \
               .format('com.databricks.spark.xml') \
               .options(rowTag='ApplicationSubmission', \
                        path=input_folder) \
               .schema(the_schema) \
               .load(input_folder+'/*.xml')

    df2.coalesce(10) \
       .write \
       .option('compression', 'snappy') \
       .option('path', parquet_folder) \
       .format('parquet') \
       .mode('append') \
       .saveAsTable(table_name, mode='append')

我希望这会将input_folder中的数据追加到parquet_folder中的现有数据中,但是在EMR步骤中执行时它会被覆盖。我试过在mode='append'中没有.saveAsTable的情况(在pyspark shell中是没有必要的)。

建议?

1 个答案:

答案 0 :(得分:0)

我不知道为什么您的方法不起作用,但是如果您使用.parquet(path)而不是.saveAsTable(...),则效果会更好。我不知道这种行为的原因,但是我以前从未见过saveAsTable用于保存数据对象,因为它在Hive元存储中创建了一个表(这不是“物理”数据对象)。 / p>

如果您的步骤通过Apache Livy运行,则它们的行为可能与在Shell上的行为不同。如果确实使用Livy,则可以在Zeppelin笔记本上测试代码,并在代码单元上指示应使用%livy-pyspark执行程序来运行它们。