【问题标题】:Changing the input data in logstash using a filter使用过滤器更改logstash中的输入数据
【发布时间】:2016-01-15 16:35:20
【问题描述】:

我有来自表格的输入数据。表数据看起来像 <Customer_id> <Item_id> <Item name>。对于客户带来的每件物品,表格中都有单独的一行。例如,如果 c1 购买 i1,i2,i3,i4,i5 它将在表中有 5 行。

现在我想插入到 elasticsearch 中的数据是这样的:

{
  "c1": [
    {
      "item_id": "i1",
      "item_name": "ABC"
    },
    {
      "item_id": "i2",
      "item_name": "XYZ"
    },
    .....
  ],
  "c2": [
    {
      "item_id": 4,
      "item_name": "PQR"
    }
  ]
}

如何在 logstash 中修改上述输入?

我的架构也是这样的:

项目: item_id , item_name

购买: cust_id, item_id

您能否建议为获得上述输出而进行的 SQL 查询?

【问题讨论】:

  • 我们是在谈论 SQL 表吗?如果是,你能展示他们各自的架构吗?
  • 是的。所以架构是这样的: Customer_ID Varchar2(10) Item_Id Varchar2 (10) Item_Name Varchar2(100)
  • 我认为我们需要另一个判别器,而不仅仅是客户,因为我猜同一个客户可能会在不同的日子(即不同的订单)购买商品。你也有 order_id 列吗?
  • 是的,我确实有。这只是一个示例描述,而不是实际描述。我只是想了解如何将这种输入转换为我想要插入到弹性搜索中的文档类型。

标签: elasticsearch logstash


【解决方案1】:

我解决此问题的方法是创建一个 SQL 查询,将 Customer_ID 上的这些行分组在一起,并使用 GROUP_CONCAT 收集该组的所有项目。

然后,您可以将logstash jdbc input 与您在上面提出的 SQL 查询一起使用,您应该会很好。

更新

我已经稍微修改了你的 SQL 查询,如下所示:

SELECT CONCAT('{"',cust_id,'": [',GROUP_CONCAT(CONCAT('{"item_id":',buy.item_id,','),CONCAT('"item_name": "',item.item_name,'"}')), ']}') 
FROM item, buy
WHERE buy.item_id = item.item_id 
GROUP BY cust_id

生成这样的行,非常接近您的需要:

{"1": [{"item_id":1,"item_name": "abc"},{"item_id":2,"item_name": "xyz"}]}
{"2": [{"item_id":4,"item_name": "pqr"}]}

【讨论】:

  • 你能试试这个吗?
  • 是的,但这似乎不起作用。因为它没有给出 { "item_id": "i1", "item_name": "ABC" },而是给出了 GROUP_CONCAT(item_name,item_id)": "ABC1"。你能帮我吗?
  • 我可以,如果您显示您的查询,请用它更新您的问题:)
  • 更新了架构细节。
  • 您能分享一下您当前的 SQL 查询吗?
猜你喜欢
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多