Java 可由两种分隔符分割的记录读取器

Java 可由两种分隔符分割的记录读取器,java,apache-pig,user-defined-functions,Java,Apache Pig,User Defined Functions,我有一个案例,我需要读取具有格式行的文件 Field1,Field2,Field3,Field4,Field5,Field6#Field1,Field2,Field3 而实现这一点的一种方法是使用带有分隔符的记录读取器,如KeyValueLineRecordReader。但是我必须使用字符串拆分UDF中,上的键和值。拆分,我觉得这会降低执行速度。 1.有提供这种格式的记录阅读器吗? 2.如果没有这样一个录音机,我有什么办法可以有效地阅读这样一行呢 输入数据为~10GB。您可以在拆分中使用正则表

我有一个案例,我需要读取具有格式行的文件

Field1,Field2,Field3,Field4,Field5,Field6#Field1,Field2,Field3
而实现这一点的一种方法是使用带有分隔符的记录读取器,如
KeyValueLineRecordReader
。但是我必须使用
字符串拆分UDF中
上的键和值。拆分
,我觉得这会降低执行速度。
1.有提供这种格式的记录阅读器吗? 2.如果没有这样一个录音机,我有什么办法可以有效地阅读这样一行呢


输入数据为~10GB。

您可以在拆分中使用正则表达式

String line = "Field1,Field2,Field3,Field4,Field5,Field6#Field1,Field2,Field3";

String arr [] = line.split(",|#");

for (String s : arr) {
    System.out.println(s);
}

既然您已经用apache pig标记了这个问题,我将给出一个pig解决方案。将记录加载到1个字段中,将#替换为“,”,然后使用来获取各个字段。不需要java或任何UDF

A = LOAD 'input.txt' AS (line:chararray);
B = FOREACH A GENERATE STRSPLIT(REPLACE(line,'#',','),',',9);
DUMP B;

我的输入数据大约为10GB。虽然拆分是我目前正在使用的东西,但我觉得它是一种蛮力的处理方式。(没有什么可以支持它,只是一种直觉)。好吧,你可以进行一个传统的循环,分别测试每个字符——虽然听起来慢一些