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

为什么Spark会输出一组csv,或者只输出一个csv?

东方旺
2023-03-14

上周,我很难从Spark获得数据,最后我不得不接受

df.toPandas().to_csv('mycsv.csv')

出了这个答案。

我测试了更原生的

df.write.csv('mycsv.csv')

对于Spark 2.0,但根据下面的注释,它会删除一组csv文件,而不是需要连接的文件,无论这在上下文中意味着什么。它还将一个空文件放入名为“成功”的目录中。目录名是 /mycsv/,但csv本身有一个由一长串字符组成的难以理解的名称。

这是我第一次听说这样的事情。Excel有多个选项卡,这些选项卡必须以某种方式反映在中。xls文件和NumPy数组可以是多维的,但我认为csv文件只是一个标题,值按行用逗号分隔为列。

另一个答案是:

query.repartition(1).write.csv("cc_out.csv", sep='|')

因此,这只会删除一个文件和一个空白的“success”文件,但该文件仍然没有您想要的名称,目录有。

有没有人知道Spark为什么要这样做,为什么它不简单地输出csv,它如何命名csv,成功文件应该包含什么,以及连接csv文件是否意味着在这里垂直连接它们,从头到尾。

共有3个答案

卫弘懿
2023-03-14

这主要是因为Spark根据数据划分的分区数转储文件。因此,每个分区只需单独转储自己的文件。可以使用合并选项将它们保存到单个文件中。有关详细信息,请查看此链接。

然而,这种方法的缺点是需要收集主节点中的所有数据,因此主节点应该包含足够的内存。在这个答案中可以看到一个解决方法。

此链接还提供了有关Spark这种行为的更多信息:

Spark就像Hadoop——事实上使用Hadoop——来执行将数据输出到HDFS等操作。当您第一次尝试保存“all-the-data.csv”时,您会知道我的意思,并惊讶地发现一个名为all-the-data.csv/的目录包含一个0字节_SUCCESS文件,然后为参与作业的每个分区提供几个part-0000n文件

胡飞舟
2023-03-14

有人知道Spark为什么这么做,为什么它不简单地输出csv,

因为它是为分布式计算而设计的,其中每个数据块(即分区)都是独立于其他数据块编写的。

它如何命名csv

名称取决于分区号。

成功文件应该包含什么

没有什么它只是表示成功。

秦禄
2023-03-14

Spark输出多个CSV有几个原因:
-Spark在分布式集群上运行。对于大型数据集,所有数据可能无法适应一台机器,但它可以适应一群机器。要编写一个CSV,所有数据大概必须在一台机器上并由一台机器写入,这可能是一台机器无法做到的。
-Spark旨在提高速度。如果数据位于5个执行器的5个分区上,那么并行编写5个CSV是有意义的,而不是将所有数据移动到单个执行器并让一个执行器写入整个数据集。

如果您需要一个CSV,我的假设是您的数据集不是超大的。我的建议是将所有CSV文件下载到一个目录中,然后运行cat*。csv

 类似资料:
  • 当我导出CSV时,数据与我使用EXCEL打开时预期的不同 CSV数据示例{“标题”:“树莓皮3型号B和树莓皮2 E-524988的ABS塑料外壳”,“URL”:“https://www.tinydeal.com/abs-plastic-case-for-raspberry-pi-3-model-b-raspberry-pi-2-p163950.html”,“discounted_price”:“R

  • 如何在单个作业中使用Spark根据密钥写入多个输出。 相关:按键写入多个输出扩展Hadoop,一个MapRe员作业 例如。 将确保为 而将是 编辑:我最近添加了一个新的答案,包括完整的导入,皮条客和压缩编解码器,请参阅https://stackoverflow.com/a/46118044/1586965,这可能是有帮助的,除了早期的答案。

  • 我做了一个插件,可以跟踪你在《我的世界》开采的钻石数量,并保存到config.yml文件中。但是我的代码似乎不工作,我不知道为什么? 我已经在setConfig参数中尝试了1,现在我已经切换到这个,它似乎仍然不起作用。我还在我的配置.yml文件中预定义了菱形。 当玩家执行命令/mydiamonds时,它会打印出“你已经开采了(a)钻石”。但不管你开采了多少钻石,它总是打印出零。

  • 问题内容: 我是Java的新手,所以我编写了这段代码,以便将这整个五年都称为布尔值,并为所有布尔值生成答案。但是,它仅调用最后一个。我该怎么做呢? 问题答案: 您每年需要使用单独的对象,或者至少在创建该年份的对象后立即调用the年检查方法。 您所拥有的是对函数的一系列调用,该函数将值分配给同一对象的属性。因此,只有最后一条语句才起作用,因为先前的值将被覆盖。 另外请注意,您的代码似乎没有正确组织。

  • 想象一下以下过程:Spark应用程序(Java实现)正在使用Cassandra数据库加载、转换为RDD并处理数据。该应用程序还从数据库中传输新数据,这些数据也由自定义接收器处理。流处理的输出存储在数据库中。该实现使用与数据库集成的Spring Data Cassandra。 CassandraConfig: 数据处理器。主要方法: 预计初始加载会有大量数据。因此,数据会在rddBuffer中分页、