scala - 尝试保存 Spark SQL Dataframes 总是导致空目录

标签 scala apache-spark dataframe apache-spark-sql jupyter-notebook

假设我有一个名为 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/

相关文章:

apache-spark - Spark :2. 0.2 java.util.ConcurrentModificationException:KafkaConsumer 对于多线程访问不安全

r - 计算数据框中所有列对之间的点积

python - 如何在 python pandas 的数据框中查找和更正拼写错误

scala split 在为空时忽略最后一个值

sockets - 随后调用Actor Freeze计划

scala - 使用 Gatling 将消息发布到 ActiveMQ

java - 为什么我在这里收到 NotSerializedException?

scala - 在scala中动态创建变量

r - 在数据框中查找子集并写入结果

scala - 我可以在一行中在 Scala 中制作 "public val"但 "private var"吗?