将数据框保存到本地文件系统会导致结果为空

时间:2018-07-30 23:07:41

标签: apache-spark amazon-emr

我们正在AWW EMR上运行spark 2.3.0。以下DataFramedf”非空且大小适中:

scala> df.count
res0: Long = 4067

以下代码可以很好地将df写入hdfs

   scala> val hdf = spark.read.parquet("/tmp/topVendors")
hdf: org.apache.spark.sql.DataFrame = [displayName: string, cnt: bigint]

scala> hdf.count
res4: Long = 4067

但是,使用相同的代码写入本地parquetcsv文件最终会得到空结果:

df.repartition(1).write.mode("overwrite").parquet("file:///tmp/topVendors")

scala> val locdf = spark.read.parquet("file:///tmp/topVendors")
org.apache.spark.sql.AnalysisException: Unable to infer schema for Parquet. It must be specified manually.;
  at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$9.apply(DataSource.scala:207)
  at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$9.apply(DataSource.scala:207)
  at scala.Option.getOrElse(Option.scala:121)

我们可以看到失败的原因:

 ls -l /tmp/topVendors
total 0
-rw-r--r-- 1 hadoop hadoop 0 Jul 30 22:38 _SUCCESS

因此没有没有实木复合地板文件正在写入。

对于csvparquet以及在两个不同的EMR服务器上,我已经尝试了20次了:在所有情况下都表现出相同的行为。

这是EMR特定的错误吗?更一般的EC2错误?还有吗这段代码适用于spark上的macos

万一重要-这里是版本信息:

Release label:emr-5.13.0
Hadoop distribution:Amazon 2.8.3
Applications:Spark 2.3.0, Hive 2.3.2, Zeppelin 0.7.3

2 个答案:

答案 0 :(得分:6)

这不是错误,这是预期的行为。 Spark并不真正支持对非分布式存储的写入(仅在您拥有共享文件系统的情况下,它才能在local模式下工作)。

本地路径不(仅)解释为驱动程序上的路径(这将需要收集数据),而是每个执行程序上的本地路径。因此,每个执行者都将自己的块写入自己的本地文件系统。

不仅输出不可读(要加载数据,每个执行程序和驱动程序应该看到文件系统的相同状态),而且取决于提交算法,甚至可能无法最终确定(从临时目录移动)。

答案 1 :(得分:0)

当您尝试读取空目录作为拼花地板时,通常会发生此错误。 你可以检查一下 1.如果DataFrame在写入结果之前为result.rdd.isEmpty()为空。 2.检查您输入的路径是否正确

您还以什么模式运行应用程序?如果您以群集模式运行,请尝试以客户端模式运行它。