我们正在运行spark 2.3.0 AWW EMR.以下DataFrame" df"非空且大小适中:
scala> df.count
res0: Long = 4067
Run Code Online (Sandbox Code Playgroud)
下面的代码工作正常写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
Run Code Online (Sandbox Code Playgroud)
但是,使用相同的代码写入本地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)
Run Code Online (Sandbox Code Playgroud)
我们可以看到它失败的原因:
ls -l /tmp/topVendors
total 0
-rw-r--r-- 1 hadoop hadoop 0 Jul 30 …Run Code Online (Sandbox Code Playgroud) 为什么火花在将结果保存到文件系统的同时,将结果文件上传到_temporary目录,然后将它们移动到输出文件夹而不是直接将它们上传到输出文件夹?