使用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中是没有必要的)。
建议?
答案 0 :(得分:0)
我不知道为什么您的方法不起作用,但是如果您使用.parquet(path)
而不是.saveAsTable(...)
,则效果会更好。我不知道这种行为的原因,但是我以前从未见过saveAsTable
用于保存数据对象,因为它在Hive元存储中创建了一个表(这不是“物理”数据对象)。 / p>
如果您的步骤通过Apache Livy运行,则它们的行为可能与在Shell上的行为不同。如果确实使用Livy,则可以在Zeppelin笔记本上测试代码,并在代码单元上指示应使用%livy-pyspark
执行程序来运行它们。