当前位置: 首页 > 知识库问答 >
问题:

将数据帧保存到本地文件系统会产生空结果

储毅
2023-03-14

我们正在AWS 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

然而,使用相同的代码写入本地< code>parquet或< code>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

因此,没有正在写入镶木地板文件。

我已经对< code>csv和< code>parquet以及两个不同的< code>EMR服务器尝试了大约二十次:在所有情况下都表现出相同的行为。

这是EMR特定的错误吗?一个更通用的EC2bug?还有什么?此代码适用于macOS上的spark

如果重要的话-以下是版本信息:

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个答案

佴博实
2023-03-14

当您试图将空目录作为parquet读取时,通常会出现此错误。你可以检查1。如果数据帧为空,则在写入之前使用outcome.rdd.isEmpty()。2.检查您给出的路径是否正确

此外,您在什么模式下运行您的应用程序?如果您在集群模式下运行,请尝试在客户端模式下运行它。

纪佐
2023-03-14

这不是bug,这是预期的行为。Spark并不真正支持写入非分布式存储(它将在本地模式下工作,因为您有共享文件系统)。

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

不仅输出是不可读的(为了加载数据,每个执行器和驱动程序应该看到相同的文件系统状态),而且根据提交算法,可能甚至没有完成(从临时目录中移走)。

 类似资料:
  • 问题内容: 我有使用Spark生成的RDD。现在,如果我将此RDD写入csv文件,则可以使用“ saveAsTextFile()”之类的一些方法,该方法将csv文件输出到HDFS。 我想将文件写入本地文件系统,以便我的SSIS进程可以从系统中选择文件并将它们加载到DB中。 我目前无法使用sqoop。 除了编写Shell脚本之外,Java中是否还有其他地方可以做到这一点? 需要任何清晰度,请告知。

  • (希望有人能帮我解决这个问题)非常感谢!!

  • 问题内容: 我有两个网站,一个是TLS,一个不是,这两个都是针对同一客户端的,但是我需要这些网站彼此(并且只能彼此)共享 用户 , 订单 , 帐户 等的通用数据。 通常可以使用数据完成此操作,但是我显然不能在其他站点上使用它们,而且我发现我可以将会话数据存储在数据库(MySQL)中,而不是文件系统中。 我已经四处搜寻,发现此有用的指南以及此较旧但 有用的指南。我还发现了该指南,该指南具有最新的My

  • 问题内容: 假设我有一个如下所示的javascript对象: 我将其字符串化以转换为JSON。如何将此JSON保存到本地文本文件,以便可以在记事本等中打开它。 问题答案: Node.js: 浏览器(webapi):

  • 我已经在Ubuntu 14.04上安装了hadoop。每当我将文件从本地文件系统复制到HDFS时,我都会出现以下错误。 我使用这个命令: 我遇到的错误是: 我是Linux环境的新手。我不明白哪个文件不存在。

  • 我需要从本地文件系统复制一个文件夹到HDFS。我找不到任何例子移动文件夹(包括它的所有子文件夹)到HDFS