当您使用ibisapi查询impala时,出于某种原因,ibisapi强制它成为子查询(当您连接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)
然后ibis生成的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
正确的?
我们不允许在被连接的表上有相同的列名吗?我很确定,在原始sql中,您可以直接使用“x作为y”,而不需要子查询。
1条答案
按热度按时间tgabmvqs1#
在过去的几个小时里,我一直在努力解决这个问题。我发现一个更好的解决办法是做以下几点。保持变量名相同。然后,在具体化之前,只选择变量的子集,这样就不会有任何重叠。
所以在你的代码里它看起来像这样:
请参阅此处以获取更多资源https://docs.ibis-project.org/sql.html