数据框无法在 S3 上写入

Posted

技术标签:

【中文标题】数据框无法在 S3 上写入【英文标题】:Dataframe not able to write on S3 【发布时间】:2018-05-24 04:39:30 【问题描述】:

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

但是当我尝试在 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')

【问题讨论】:

我了解就地写入并不安全。这个答案解释了解决这个问题的原因和方法***.com/a/49842311/5189811 我对 AWS 了解不多,但我想知道一件事,如果您的分区名称是 local_dt 和 site_name,它应该在您的 hdfs 路径中吗? 您要手动删除分区吗? @JaishreeRout 它的S3位置和外部表路径和写入路径不同 @MaheshKalani,好的,我对此不太了解。您可以将此问题标记为 Amazon-s3。您可能会得到更多更快的响应。 【参考方案1】:

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

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

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

【讨论】:

分区存在,但在 S3 写入最终数据帧之前,表文件已被覆盖。但我的问题是最终数据帧与表分区有什么关系。 该文件是否存在? 也许你应该在覆盖后再次尝试读取数据帧? 那个文件被新数据覆盖了。所以现在有新名称的文件。但是表覆盖和数据帧写入是不同的,那么为什么数据帧写入会出现问题 我认为我的回答解决了您的问题“为什么数据帧写入出现问题”

以上是关于数据框无法在 S3 上写入的主要内容,如果未能解决你的问题,请参考以下文章

将大型 Spark 数据帧作为镶木地板写入 s3 存储桶

无法计算 MD5:AWS S3 存储桶

在 S3 中将每个分区数据写入单个文件中

从 s3 获取数据并写入文件后无法从文件中读取数据

胶水作业无法写入文件

将pyspark数据框写入文本文件