无法将数据附加到镶木地板 [FileAlreadyExists 异常]
Posted
技术标签:
【中文标题】无法将数据附加到镶木地板 [FileAlreadyExists 异常]【英文标题】:Unable to append data to parquet [FileAlreadyExists exception] 【发布时间】:2016-09-05 13:44:43 【问题描述】:我正在尝试使用以下命令将数据帧中的数据附加到现有的镶木地板文件:
dfModified
.write
.mode("append")
.parquet("/home/hduser/s_s_c/fadpd/fadpd.parquet")
但我不断收到这种异常:
Exception in thread "main" org.apache.hadoop.fs.FileAlreadyExistsException: Parent path is not a directory: file:/home/hduser/s_s_c/fadpd/fadpd.parquet
另外,我将 spark.speculation 在开头设置为 false。 有谁知道我在哪里弄错了?感谢您的帮助和时间!
【问题讨论】:
我相信 Spark 附加模式让您可以选择将其他 parquet 文件添加到现有目录,而不是实际将其他数据附加到现有 parquet 文件。如果您删除镶木地板文件的名称 (fadpd.parquet),我相信您的代码会起作用。 你在这里绝对正确,如果我删除fadpd.parquet
,代码将起作用。但是,想象一下,当你更新/插入或类似的东西几千次,甚至几百万次之后。分区将超过 500 个,您将不得不合并数千个镶木地板文件。我不认为一个会是有效的。你做?为每次更新或插入创建新的 parquet 文件是否有意义?
一般大量的小文件会对性能产生非常显着的负面影响。处理此类问题的最直接的方法是: 1. 在流式应用程序中,您可以缓冲数据直到它达到一定大小,然后才将其溢出到输出。 2. 在批处理应用程序中,您可能会识别出小文件的存在,并将它们读入内存 + 合并到新的输出,然后再写入输出 3. 在这两种情况下,您都可以使用额外的合并过程,该过程将扫描目录并创建一次更大的文件一会儿
“正确”方法始终取决于许多特定于您的用例的变量,例如应用程序类型、将数据写入输出的频率、估计的吞吐量等...
【参考方案1】:
适用于所有试图在 parquet 文件中附加数据的人。您不能附加 parquet 文件。您需要重新创建一个新的,当您查询时,您需要查询所有这些:)
【讨论】:
以上是关于无法将数据附加到镶木地板 [FileAlreadyExists 异常]的主要内容,如果未能解决你的问题,请参考以下文章