Kettle:按顺序填充字段而不发生冲突

发布于 2024-12-16 21:17:35 字数 437 浏览 4 评论 0原文

我有一个具有以下结构的数据流

user_id (integer)
user_name (string)

user_id 是 100 到 65536 之间的任何值。我想根据以下逻辑添加 target_user_id (整数)字段:

  • If < code>user_id 在 1000..9999 范围内,则让 target_user_id 字段等于 user_id
  • 如果不是,然后用 1000..9999 范围内的内容填充 target_user_id ,而不会引起冲突。最好尽可能最低。

流的长度小于9000。user_id字段在原始流中是唯一的。

I have a data stream with the following structure

user_id (integer)
user_name (string)

The user_id is anything between 100 and 65536. I want to add a target_user_id (integer) field according to the following logic:

  • If user_id is in range 1000..9999, then let the target_user_id field be equal to the user_id
  • If not, then fill target_user_id with something in range 1000..9999 without causing a conflict. Preferably the lowest possible.

The length of the stream is under 9000. The user_id field is unique in the original stream.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挽容 2024-12-23 21:17:35

我不确定您使用的是什么 Kettle 环境,但一般过程可能如下:

  1. 创建一个临时数据库表(可能是内存数据库表)
  2. 使用 user_id 1000..9999 和 user_name=null 的记录初始化它(使用 TableOutput )
  3. 通过使用 user_name 更新相应的数据库记录,打开输入流并处理 user_id 1000..9999 的记录。 (使用更新)忽略所有其他记录。
  4. 关闭并重新打开输入流
  5. 通过以下方式处理 user_id 不在 1000..9999 的每个输入流记录:

    • 通过执行 SQL 查询 (DBLookup) 获取最低的未使用 user_id

      从临时表中选择 MIN(user_id),其中 user_name 为 NULL;
      
    • 使用当前用户名更新此记录(使用更新)

  6. 使用非空用户名(使用 TableInput)读取临时数据库表中的每条记录并写入输出流
  7. 删除临时数据库表

希望这有帮助

I am not sure what Kettle environment you are using but a general procedure could be as follows:

  1. Create a temporary database table (Maybe an in-memory database table)
  2. Initialise it with records with user_id 1000..9999 and user_name=null (use TableOutput)
  3. Open the input stream and process records with user_id 1000..9999 by updating the respective database record with the user_name. (use Update) Ignore all other records.
  4. Close and reopen the input stream
  5. Process each input stream record with user_id not in 1000..9999 by:

    • get the lowest unused user_id by executing a SQL query (DBLookup)

      SELECT MIN(user_id) FROM temporary_table WHERE user_name IS NULL;
      
    • Update this record with the current user_name (use Update)

  6. Read each record in the temporary database table with a non null user_name (use TableInput) and write to output stream
  7. Delete temporary database table

Hope this helps

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文