Pentaho Kettle将CSV分成多个记录

时间:2013-07-17 21:21:01

标签: csv etl pentaho kettle

我是Kettle的新手,但到目前为止还很顺利。但是我无法弄清楚如何做到这一点。

我有一个看起来像这样的csv

a, col1, col2, col3
a, col1, col2, col3
a, col1, col2, col3
b, col1, col2, col3
b, col1, col2, col3
c, col1, col2, col3
c, col1, col2, col3

第一列以键(a,b,c)开头,然后是其余列。我想要做的是读取csv(得到覆盖),然后基于密钥拆分csv,所以我有3个数据块/数据组,然后将每个数据块转换为一个单独的json文件,我我想我能得到。

我无法理解的是对数据进行分组,然后在每个单独的组上执行单独的操作(转换为json)。它不是创造json我有问题。

数据来自许多环境传感器的传感器网络,因此有许多密钥,数百个,并且新增加了新密钥。我之前使用map reduce来处理这些数据,因为分区的概念是我在这里尝试复制的,而不使用kettle的hadoop元素,因为部署是不同的。一旦我对数据进行了分区,就需要将其作为单独的记录加载到不同的位置。密钥是传感器的唯一ID(序列号)。

有什么想法吗?

谢谢

2 个答案:

答案 0 :(得分:1)

我想创建一个javascript来输出JSON中的行的字段,比如添加到行中的字符串:

{"id":"a","col1":"1","col2":"2","col3":"3"}

接下来,您可以使用组步骤并将基本字段设置为“id”字段,并将“以字符串分隔的连接字符串”类型中的javascript值聚合为

{"id":"a","col1":"1","col2":"2","col3":"3"},{"id":"a","col1":"4","col2":"5","col3":"6"}, {"id":"a","col1":"7","col2":"8","col3":"9"}

在它周围添加一些标签,你就拥有了有效的json。接下来,您可以使用javascript步骤组装文件名:

var file_name="C:\\dir\\"+ id + ".txt";

使用文本文件输出并将文件名字段设置为“file_name”。删除分隔符/磁盘阵列选项,使其无需额外格式化,您就完成了。

答案 1 :(得分:1)

如果我已正确理解您的问题,您可以使用" GROUP BY"步骤将列分组(即数据集中的第一个标题),然后将它们存储到内存中。

enter image description here

一旦完成,请使用参数循环来获取变量"并动态生成多个JSON输出。检查下图:

enter image description here

在JSON输出步骤中,使用header1之类的变量生成多个文件。突出显示我在JSON输出中所做的更改。

enter image description here

如果您发现令人困惑,我已在here上传了示例代码。

希望有所帮助:)