Dataframe无法在S3上写入

时间:2018-05-24 04:39:31

标签: apache-spark amazon-s3 pyspark apache-spark-sql

我正在从现有的hive表创建一个数据帧.Table在日期和站点列上进行分区。现在,当我尝试在使用前一天数据进行一些计算后覆盖同一个表中的数据时。它已成功加载。

但是当我试图在S3桶中编写最终数据帧时。我收到错误,说找不到文件。现在提到的文件是前一天的文件,现在被覆盖了。

如果我首先写入数据帧然后覆盖表,那么它运行正常。

对于在S3位置写入,它与表分区文件有什么关系?

以下是错误和代码。

  

java.io.FileNotFoundException:没有这样的文件或目录:s3:// bucket_1 / DM / web_fact_tbl / local_dt = 2018-05-10 / site_name = ABC / part-00000-882a6e29-eb6a-477c-8b88-6fe853956674 .c000

fact_tbl = spark.table('db.web_fact_tbl')
fact_lkp = fact_tbl.filter(fact_tbl['local_dt']=='2018-05-10')
fact_join = fact_lkp.alias('a').join(fact_tbl.alias('b'),(col('a.id') == col('b.id')),"inner").select('a.*')
fact_final = fact_join.union(fact_tbl)
fact_final.coalesce(2).createOrReplaceTempView('cwf')
spark.sql('INSERT OVERWRITE TABLE dm.web_fact_tbl PARTITION (local_dt, site_name) \
                           SELECT * FROM cwf')
fact_final.write.csv('s3://bucket_1/yahoo')

1 个答案:

答案 0 :(得分:0)

在最后一行之前fact_final只是一个“懒惰”的数据框对象,仅包含定义。它不包含任何数据。但它有指向精确数据文件的指针,实际存储数据。

当您尝试执行实际操作时(无论是写入S3还是执行fact_final.count()之类的查询),您都会收到上述错误。看起来分区local_dt=2018-05-10不再存在(位于其后面的文件/文件夹不存在)。

您可以尝试在最终写入之前再次重新初始化数据帧(这是另一个懒惰的操作 - 在您在S3上编写时,所有工作都在您的情况下完成)。