宜必思黑斑羚 JOIN 问题与重新标记/名称"列 AS 新名称"



当您使用IBIS API查询Impala时,出于某种原因,IBIS API强迫它成为子查询(当您加入4-5个桌子时,它突然变得非常慢(。由于列名称重叠问题,它根本不会正常加入。我想要一种快速重命名列的方法,这不是SQL通常工作的方式吗?

i0 = impCon.table('shop_inventory')
s0 = impCon.table('shop_expenditure')
s0 = s0.relabel({'element_date': 'spend_element_date', 'element_shop_item': 'spend_shop_item'})
jn = i0.inner_join(s0, [i0['element_date'] == s0['spend_element_date'], i0['element_shop_item'] == s0['spend_shop_item']])
jn.materialize()
jn.execute(limit=900)

然后,您有IBI生成SQL,它在没有我建议的情况下将其划分为sql:

SELECT *
FROM (
  SELECT `element_date`, `element_shop_item`, `element_address`, `element_expiration`,
         `element_category`, `element_description` 
  FROM dbp.`shop_inventory`
) t0
  INNER JOIN (
    SELECT `element_shop_item` AS `spend_shop_item`, `element_comm` AS `spend_comm`,
           `element_date` AS `spend_date`, `element_amount`,
           `element_spend_type`, `element_shop_item_desc`
    FROM dbp.`shop_spend`
  ) t1
    ON (`element_shop_item` = t1.`spend_shop_item`) AND
       (`element_category` = t1.`spend_category`) AND
       (`element_subcategory` = t1.`spend_subcategory`) AND
       (`element_comm` = t1.`spend_comm`) AND
       (`element_date` = t1.`spend_date`)
LIMIT 900

为什么这么困难?

理想情况下应该很简单:

jn = i0.inner_join(s0, [s0['element_date'].as('spend_date') == i0['element_date']]

生成一个: SELECT s0.element_date as spend_date, i0.element_date INNER JOIN s0 dbp.shop_spend ON s0.spend_date == i0.element_date

对吗?

我们不允许在桌子上拥有相同的列名称吗?我很确定在RAW SQL中,您只需使用" X AS Y"而无需子查询。

我在过去的几个小时中挣扎了同样的问题。我发现的一个更好的解决方案是进行以下操作。加入保持变量名称相同。然后,在实现之前,仅选择变量的子集,以免任何重叠。

因此,在您的代码中,它看起来像这样:

jn = i0.inner_join(s0, [i0['element_date'] == s0['element_date'], i0['element_shop_item'] == s0['element_shop_item']])
expr = jn[i0, s0['variable_of_interest_1'],s0['variable_of_interest_2']]
expr.materialize()

请参阅此处以获取更多资源https://docs.ibis-project.org/sql.html

最新更新