impala - Ibis Impala 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)
然后你有 IBIS 生成 SQL,它在没有我建议的情况下对它进行 SUBQUERYING:
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 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
推荐阅读
- csv - 存储为子句 CSV Hive 中无法识别的文件格式
- sql - 寻找在给定字符串中包含 2 个唯一字符的最长子字符串
- php - PHP - 如何在不使用 GLOABL 的情况下访问类中其他函数的值?
- flutter - 如何删除/减少 Flutter 中 CheckboxListTile 的文本和复选框之间的空间?
- javascript - 如何双击切换 React 组件的可见性?
- python - 在 Pandas 中显示列名并添加行号
- r - 在r中选择以其他数据框列为条件的行
- angular - Angular8模板驱动表单抛出错误:TypeError:无法读取Object.eval中未定义的属性'ProviderName' [as updateDirectives]
- reactjs - 从侧边栏反应在内容组件中打开反应引导模式
- html - 将浏览器地址栏中的可搜索关键字配置为我网站的 url