2016-03-08 168 views
0

我想编辑csv(超过500MB)文件。 像编辑Scala中的csv文件

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数据类型。

(上)渊源考的CSV文件 - >(下)(新csv文件,文件的数据(RDD型)?)

Q1。哪种数据治疗方法最好?

  1. 从原始csv文件创建一个新的csv文件,然后重新打开新的csv文件到scala数据。
  2. 先创建新的scala数据并将其作为csv文件。

Q2。我是否需要为此使用'dataframe'?我应该使用哪个库或API?

回答

1

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

让我们假设你将使用DataFrames(DF)现在:

流量:听起来像是你应该

  1. 加载原始文件到DF,称之为input
  2. 它转换为新的DF,叫做withDiff
  3. 至此,缓存的结果会有意义,我们来调用缓存DF result
  4. 现在你可以为任何你需要
+0

感谢它真的帮助我:) –

+1

根据你以后想要处理的数据,DF和RDD都不是很好的匹配。你的“差异”列需要通过文件的线性运行,所以你不会从Spark的并行性质中获益。 –

3

个极其普通的方式再次保存result到新的CSV文件

  • 使用result实现那就是使用kantan.csv

    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,一个String ...

  • +0

    哦,我刚刚了解你的DIFF专栏是如何工作的。我的例子只是在里面插入一个随机值,你需要稍微修改它以区别于之前的元素,但是你可以用相对简单的折叠来做到这一点。 –