首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新标记/名称“column AS newName”时的Ibis Impala联接问题

重新标记/名称“column AS newName”时的Ibis Impala联接问题
EN

Stack Overflow用户
提问于 2019-05-11 01:32:43
回答 1查看 333关注 0票数 0

当您使用Ibis API查询impala时,出于某种原因,Ibis API会强制它成为一个子查询(当您连接4-5个表时,它会突然变得超级慢)。由于连接上的列名重叠问题,它根本不会正常连接。我想要一种快速重命名列的方法,这不是SQL通常的工作方式吗?

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

为什么这这么难呢?

理想情况下,它应该像这样简单:

代码语言:javascript
复制
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 AS Y“,而不必使用子查询。

EN

回答 1

Stack Overflow用户

发布于 2019-06-16 05:31:55

在过去的几个小时里,我一直在纠结于这个问题。我发现的一个更好的解决方案是执行以下操作。Join保持变量名不变。然后,在实现之前,只选择变量的一个子集,这样就不会有任何重叠。

因此,在您的代码中,它将如下所示:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56082345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档