假设我有一个名为 df
的 DataFrame。我运行以下命令以尝试将其保存在本地:
df.coalesce(1).
write.
format("com.databricks.spark.csv").
option("header", "true").
parquet("example")
}
但是,当我这样做并检查文件是否已创建时(在目录 example
中,我看到一个只有两个文件的目录:
_SUCCESS ._SUCCESS.crc
如何让 DataFrame 正确保存文件?
如果这很重要,我也通过 Jupyter Notebook 来执行此操作,所以基本上,当我在本地说时,我的意思是我将它保存在 Jupyter Notebook 服务器上,而不是 Spark 运行的地方(我让 Spark 指向另一个主控节点)。
最佳答案
事实证明,Spark 通过 Hadoop 完成所有文件操作,它会在它运行的每个节点上制作目录副本,运行命令的节点只会保存它拥有的部分数据。
您可以通过在 DataFrame 上使用“coalesce(1)”或“repartition(1)”强制节点收集所有数据,但您无法控制哪个节点接收单个分区。
结果是,没有数据集分区的节点(例如驱动程序)将只有一个“_SUCCESS”文件来表明操作成功。您应该会发现您的数据位于不同的任意节点上。
我自己无法解决这个问题,但使用分布式文件系统(例如 HDFS)将是一个解决方案。
关于scala - 尝试保存 Spark SQL Dataframes 总是导致空目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38228948/