在Scala中编辑csv文件

时间:2016-03-08 04:19:57

标签: scala csv apache-spark

我想编辑csv(超过500MB)文件。 如果我有像

这样的数据
ID, NUMBER
A, 1
B, 3
C, 4
D, 5

我想添加一些额外的列,如

ID, NUMBER, DIFF
A, 1, 0
B, 3, 2
C, 4, 1
D, 5, 1

此数据也可以在ScSla数据类型中使用。

(in)Orgin Csv文件 - > (out)(新的csv文件,文件数据(RDD类型?))

Q1。哪种方式是处理数据的最佳方式?

  1. 从原始csv文件创建一个新的csv文件,然后将新的csv文件重新打开为scala数据。
  2. 首先制作新的scala数据并将其设为csv文件。
  3. Q2。我是否需要使用' dataframe'为了这?我应该使用哪个库或API?

2 个答案:

答案 0 :(得分:3)

实现这一目标的一个相当简单的方法是使用similar QA

import kantan.csv.ops._
import kantan.csv.generic.codecs._
import java.io.File

case class Output(id: String, number: Int, diff: Int) 
case class Input(id: String, number: Int)

val data = new File("input.csv").asUnsafeCsvReader[Input](',', true)
                                .map(i => Output(i.id, i.number, 1))

new File("output.csv").writeCsv[Output](data.toIterator, ',', List("ID", "NUMBER", "DIFF"))

无论数据大小如何,此代码都能正常工作,因为我们在任何时候都不会在内存中加载整个数据集(或者实际上是多行)。

请注意,在我的示例代码中,数据来自并传递到File个实例,但它可能来自任何可以转换为Reader实例的内容 - URI,字符串......

答案 1 :(得分:1)

RDD与DataFrame :两者都是不错的选择。建议使用DataFrames,它允许在幕后进行一些额外的优化,但对于足够简单的任务,性能可能类似。使用DataFrames的另一个优点是能够使用SQL - 如果您对SQL感到满意,您只需加载文件,将其注册为临时表并查询它以执行任何转换。 DataFrames的一个更相关的优势是能够使用databricks' spark-csv库轻松读取和写入CSV文件。

假设您现在将使用DataFrames(DF):

流程:听起来应该

  1. 将原始文件加载到DF,将其命名为input
  2. 将其转换为名为withDiff
  3. 的新DF
  4. 此时,缓存结果是有意义的,让我们调用缓存的DF result
  5. 现在,您可以将result保存到新的CSV文件
  6. 再次使用result,无论您需要什么