数据格式:
"header1","header2","header3",...
"value11","value12","value13",...
"value21","value22","value23",...
....
在Scalding中解析它的最佳方法是什么?我总共有50多个专栏,但我只对其中的一些感兴趣。我试着用Csv("file")导入它,但那不起作用。
想到的唯一解决方案是使用TextLine手动解析它,并忽略带有offset == 0的行。但我相信一定有更好的解决办法。
最后,我通过手动解析每行来解决这个问题,如下所示:
def tipPipe = TextLine("tip").read.mapTo('line ->('field1, 'field5)) {
line: String => val arr = line.split("","")
(arr(0).replace(""", ""), if (arr.size >= 88) arr(4) else "unknown")
}
看起来您的数据集中有88个字段(超过22个字段),而不仅仅是1个。阅读:
https://github.com/twitter/scalding/wiki/Frequently-asked-questions what-if-i-have-more-than-22-fields-in-my-data-set
查看上面的链接:
如果我的数据集中有超过22个字段怎么办?
许多示例(例如在教程/目录中)表明字段参数在读取分隔符时被指定为一个Scala元组文件。然而,Scala元组目前被限制为最多22个元素。要读入包含超过22个字段的数据集,可以使用作为字段说明符的符号列表。例如
val mySchema = List('first, 'last, 'phone, 'age, 'country)
val input = Csv("/path/to/file.txt", separator = ",",
fields = mySchema) val output = TextLine("/path/to/out.txt") input.read
.project('age, 'country)
.write(Tsv(output))
另一种指定字段的方法是使用Scala枚举,它可以在开发分支中使用(截至4月2日)。2013),如教程6所示:
object Schema extends Enumeration {
val first, last, phone, age,country = Value // arbitrary number of fields
}
import Schema._
Csv("tutorial/data/phones.txt", separator = " ", fields = Schema)
.read.project(first,age).write(Tsv("tutorial/data/output6.tsv"))
因此,在读取文件时,使用List或Enumeration提供包含所有88个字段的模式(参见上面的链接/quote)
为了跳过标题,您可以在Csv构造函数中另外提供skipHeader = true。
Csv("tutorial/data/phones.txt", fields = Schema, skipHeader = true)