我正在解析分隔文件文件以获取我将放入数据库表的信息。
现在,我有一个文件,我必须合并每两行,以获取有关单个寄存器(数据库表的一行)的信息 - 第1行有一些数据库行的字段,第2行有一些其他字段放在同一行。
如何一次处理两行?
例如,假设我有一个包含6行的文件,它对应于我的数据库表中的3个条目,它有9列。从“奇数行”我得到第1,3,4,5,8和9列。从“偶数行”,我得到剩余的信息(第2列,第6列和第7列):
IN | COLUMN1 | xxxxxxx | COLUMN3 | COLUMN4 | COLUMN5 | xxxxxxx | xxxxxxx | COLUMN8
OUT | xxxxxxx | COLUMN2 | xxxxxxx | xxxxxxx | xxxxxxx | COLUMN6 | COLUMN7 | xxxxxxx
IN | COLUMN1 | xxxxxxx | COLUMN3 | COLUMN4 | COLUMN5 | xxxxxxx | xxxxxxx | COLUMN8
OUT | xxxxxxx | COLUMN2 | xxxxxxx | xxxxxxx | xxxxxxx | COLUMN6 | COLUMN7 | xxxxxxx
IN | COLUMN1 | xxxxxxx | COLUMN3 | COLUMN4 | COLUMN5 | xxxxxxx | xxxxxxx | COLUMN8
OUT | xxxxxxx | COLUMN2 | xxxxxxx | xxxxxxx | xxxxxxx | COLUMN6 | COLUMN7 | xxxxxxx
答案 0 :(得分:2)
您可以尝试将文件拆分为2种类型的行,然后使用tMap加入它们。
为了进一步说明你要根据它是IN还是OUT来拆分文件,然后根据需要使用tMap加入列。
我已经修改了一些示例数据,看起来有点像:
|=---+-----------+-----------+-----------+-----------+-----------+-----------+-----------+----------=|
|IN1 |ROW1COLUMN1|xxxxxxx |ROW1COLUMN3|ROW1COLUMN4|ROW1COLUMN5|xxxxxxx |xxxxxxx |ROW1COLUMN8|
|OUT1|xxxxxxx |ROW1COLUMN2|xxxxxxx |xxxxxxx |xxxxxxx |ROW1COLUMN6|ROW1COLUMN7|xxxxxxx |
|IN2 |ROW2COLUMN1|xxxxxxx |ROW2COLUMN3|ROW2COLUMN4|ROW2COLUMN5|xxxxxxx |xxxxxxx |ROW2COLUMN8|
|OUT2|xxxxxxx |ROW2COLUMN2|xxxxxxx |xxxxxxx |xxxxxxx |ROW2COLUMN6|ROW2COLUMN7|xxxxxxx |
|IN3 |ROW3COLUMN1|xxxxxxx |ROW3COLUMN3|ROW3COLUMN4|ROW3COLUMN5|xxxxxxx |xxxxxxx |ROW3COLUMN8|
|OUT3|xxxxxxx |ROW3COLUMN2|xxxxxxx |xxxxxxx |xxxxxxx |ROW3COLUMN6|ROW3COLUMN7|xxxxxxx |
'----+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------'
唯一真正的补充是,现在有一个关键如何在第一列的IN或OUT旁边加入。
首先,您需要使用tMap设置将数据拆分为进出部分:
根据Id字段是以“IN”还是“Out”开头,这只是根据两条路径之一发送数据。
在此之后,您需要将其与另一个tMap设置重新组合,如:
此连接基于Id文件中提取的密钥,并使用组合输出中的相应列。
不幸的是你不能用tMap拆分流,然后直接将它重新加入到另一个tMap中,所以最好把它输出到两个不同的地方(数据库表或临时CSV文件),然后当它subjob完成然后在那些单独的地方读取并与第二个tMap重新组合。
示例作业可能如下所示:
如果你没有自然键加入,那么你可以通过获取第一个tMap的输出然后添加一个表达式为Numeric.sequence的列作为列的值来生成一个。 / p>