我们正在AWW EMR
上运行spark 2.3.0。以下DataFrame
“ df
”非空且大小适中:
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
但是,使用相同的代码写入本地parquet
或csv
文件最终会得到空结果:
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
因此没有没有实木复合地板文件正在写入。
对于csv
和parquet
以及在两个不同的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
答案 0 :(得分:6)
这不是错误,这是预期的行为。 Spark并不真正支持对非分布式存储的写入(仅在您拥有共享文件系统的情况下,它才能在local
模式下工作)。
本地路径不(仅)解释为驱动程序上的路径(这将需要收集数据),而是每个执行程序上的本地路径。因此,每个执行者都将自己的块写入自己的本地文件系统。
不仅输出不可读(要加载数据,每个执行程序和驱动程序应该看到文件系统的相同状态),而且取决于提交算法,甚至可能无法最终确定(从临时目录移动)。
答案 1 :(得分:0)
当您尝试读取空目录作为拼花地板时,通常会发生此错误。 你可以检查一下 1.如果DataFrame在写入结果之前为result.rdd.isEmpty()为空。 2.检查您输入的路径是否正确
您还以什么模式运行应用程序?如果您以群集模式运行,请尝试以客户端模式运行它。