我想编辑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。哪种方式是处理数据的最佳方式?
Q2。我是否需要使用' dataframe'为了这?我应该使用哪个库或API?
答案 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):
流程:听起来应该
input
withDiff
result
result
保存到新的CSV文件result
,无论您需要什么