【发布时间】:2019-01-07 06:16:08
【问题描述】:
我们正在AWS 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
所以没有拼花文件正在写入。
我已经尝试了大约 20 次,对于 csv 和 parquet 以及两个不同的 EMR 服务器:在所有情况下都表现出相同的行为。
这是 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
【问题讨论】:
-
只是好奇!!你是在运行执行程序的机器上做
ls -l /tmp/topVendors吗?