Scala 烫伤:使用头解析逗号分隔的数据

Scala 烫伤:使用头解析逗号分隔的数据,scala,parsing,hadoop,mapreduce,scalding,Scala,Parsing,Hadoop,Mapreduce,Scalding,我有以下格式的数据: "header1","header2","header3",... "value11","value12","value13",... "value21","value22","value23",... .... 在烫伤中解析它的最佳方法是什么?我总共有50多个专栏,但我只对其中的一些感兴趣。我试着用Csvfile导入它,但不起作用 想到的唯一解决方案是使用TextLine手动解析它,忽略offset==0的行。但我相信一定有更好的解决方案。看起来您的数据集中有88个字段

我有以下格式的数据:

"header1","header2","header3",...
"value11","value12","value13",...
"value21","value22","value23",...
....
在烫伤中解析它的最佳方法是什么?我总共有50多个专栏,但我只对其中的一些感兴趣。我试着用Csvfile导入它,但不起作用


想到的唯一解决方案是使用TextLine手动解析它,忽略offset==0的行。但我相信一定有更好的解决方案。

看起来您的数据集中有88个字段,远远超过了22个字段,而不仅仅是1个。阅读:

请参见上面链接中的文本:

如果我的数据集中有超过22个字段呢

教程/目录中的许多示例表明 字段参数在读取分隔符时指定为Scala元组 文件但是,Scala元组目前最多限制为22个 元素。要读取包含22个以上字段的数据集,可以使用 作为字段说明符的符号列表。例如

另一种指定字段的方法是使用Scala枚举,从4月2日起在develop分支中提供, 2013年,如教程6所示:

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

为了跳过标题,您还可以在Csv构造函数中提供skipHeader=true

Csv("tutorial/data/phones.txt", fields = Schema, skipHeader = true)

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

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")
}

我试着用Csvfile导入它,但不起作用。-你可能应该解释一下为什么它不起作用。例如,它是否会导致编译时或运行时错误?我尝试导入它,提供了一个由我感兴趣的一个字段组成的模式,但我没有解析输入数据中正确数量的值,预期为:1,get:88:x,xxx,。。。。当我没有提供架构时,我得到了:无法选择字段:[{1}:'fieldName'],从:[{?}:未知]我已经读过了。关键是,我只对几个字段感兴趣,不打算为此创建一个庞大的模式。我很感激你只想投影你想要的字段,而不提供模式,但看看当前的scala元组限制,只有当你有多达22个字段时,你才能这样做。因此,作为一种解决方法,提供模式来解析文件。然后使用project函数只投影您感兴趣的字段。是否有类型安全api TypedTsv的等效项?
Csv("tutorial/data/phones.txt", fields = Schema, skipHeader = true)
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")
}