【问题标题】:How to write standard CSV如何编写标准 CSV
【发布时间】:2020-01-28 05:35:30
【问题描述】:

读取标准CSV文件非常简单,例如:

 val t = spark.read.format("csv")
 .option("inferSchema", "true")
 .option("header", "true")
 .load("file:///home/xyz/user/t.csv")

它读取一个真正的 CSV 文件,例如

   fieldName1,fieldName2,fieldName3
   aaa,bbb,ccc
   zzz,yyy,xxx

t.show 产生了预期的结果。

我需要反过来,编写标准 CSV 文件(不是非标准文件的目录)。

在使用write 时看不到相反的结果是非常令人沮丧的。也许存在其他选项或某种format (" REAL csv please! ")


注意事项

我正在使用 Spark v2.2 并在 Spark-shell 上运行测试。

read 的“语法逆向”是write,因此预计会产生相同的文件格式。但是结果

   t.write.format("csv").option("header", "true").save("file:///home/xyz/user/t-writed.csv")

不是rfc4180标准格式的CSV文件,和原来的t.csv一样, 但是带有文件的t-writed.csv/ 文件夹 part-00000-66b020ca-2a16-41d9-ae0a-a6a8144c7dbc-c000.csv.deflate _SUCCESS 这似乎是“镶木地板”、“ORC”或其他格式。

任何具有“读某些东西”的完整工具包的语言都能够“写东西”,它是一种orthogonality principle

类似不解决

没有解决问题的类似问题或链接,可能使用了不兼容的 Spark 版本,或者 spark-shell 限制了使用它。他们为专家提供了很好的线索:

  • 这个similar question pointed by @JochemKuijpers:我尝试了建议但得到了同样丑陋的结果。

  • This link 说有解决方案(!),但我无法在我的 spark-shell 中复制/粘贴 saveDfToCsv()“错误:未找到:类型 DataFrame”) ,有什么线索吗?

【问题讨论】:

  • simple small and standard CSV file
  • @IsmaelMiguel,对不起,我更正了问题的文字。我正在使用 CSV 文件进行读/写配置并发布(大数据)摘要的结果......小 CSV 文件,没有“大数据 CSV”。
  • very simple (one line) -> 请注意,将所有代码放在一行并不会使其更简单。通常,如果您创建包含多个语句或函数调用的行,它会更难阅读、理解和推理,而不是更容易。
  • @JochemKuijpers,有道理,我编辑了问题,这不是重点。
  • @PeterKrauss 你能举一个格式问题的例子吗?如果不复制设置,我们很难考虑这些。您需要 spark 以您喜欢的格式生成 CSV,还是可以对其进行后处理?

标签: apache-spark export-to-csv


【解决方案1】:

如果您使用 Spark 是因为您正在使用“大”* 数据集,那么您可能不想要像 coalesce(1)toPandas() 这样的东西,因为这很可能会使您的驱动程序崩溃(因为整个数据集必须适合驱动程序 RAM,而它通常不适合)。

另一方面:如果您的数据确实适合单台机器的 RAM - 为什么要使用分布式计算来折磨自己?

*定义各不相同。我的个人是“不适合 Excel 工作表”。

【讨论】:

  • 不,“大数据宇宙”不是孤岛(!),我需要与small datasets 交互以加入和规范化数据,或者生成和发布摘要 ...因此,如问题所述,我需要为 CSV 或 JSON 小文件生成 标准 文件(在现实世界中用于摘要或更新数据集加入——见链接)。所有程序员和 Spark 数据分析员都不是说而是做...但是使用 Scala,我可以访问的源代码都很难使用直接println() 生成 JSON 和 CSV 小文件。
  • "summarizations",大数据通过聚合函数简化为小数据cwiki.apache.org/confluence/display/Hive/…
  • k,明白了。您管道中的下一个工具是什么?
  • 我一直在寻找标准的 Java 包或 Github Scala CSV 编写器...任何(可靠且)易于安装和维护的包。有什么建议吗?
【解决方案2】:

如果数据框不是太大,你可以试试:

df.toPandas().to_csv(path)

如果数据框很大,您可能会遇到内存不足错误或打开文件过多错误。

【讨论】:

  • 嗨,好答案(!)。 Pandas 为许多框架提供了很好的插件,特别是它的数据帧与 Apache Spark 兼容......但不幸的是,Pandas 不是“Spark 生态系统”的标准模块,因此在 Scala Spark 中没有 toPandas()。主要标准方法在 Scala 或all Scala/Python/Java
猜你喜欢
  • 2012-05-06
  • 2016-06-30
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多