2

我有以下格式的数据:

"header1","header2","header3",...
"value11","value12","value13",...
"value21","value22","value23",...
....

在 Scalding 中解析它的最佳方法是什么?我总共有 50 多个专栏,但我只对其中一些感兴趣。我尝试使用 Csv("file") 导入它,但这不起作用。

想到的唯一解决方案是使用 TextLine 手动解析它并忽略偏移量 == 0 的行。但我确信必须有更好的解决方案。

4

2 回答 2

1

看起来您的数据集中有 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 个字段怎么办?

许多示例(例如在 tutorial/ 目录中)表明,在读取分隔文件时,fields 参数被指定为 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 枚举,它在开发分支中可用(截至 2013 年 4 月 2 日),如教程 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"))

因此,在阅读您的文件时,使用列表或枚举提供一个包含所有 88 个字段的模式(参见上面的链接/引用)

要跳过标头,您可以在 Csv 构造函数中另外提供 skipHeader = true 。

Csv("tutorial/data/phones.txt", fields = Schema, skipHeader = true)
于 2014-07-31T11:22:14.247 回答
1

最后我通过手动解析每一行来解决它,如下所示:

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")
}
于 2014-07-31T12:39:49.197 回答