Ibis Impala JOIN проблема с релабелем / именем 'колонка AS newName' - PullRequest
0 голосов
/ 10 мая 2019

Когда вы используете Ibis API для запроса импалы, по какой-то причине 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, который отправляет его без моего предложения:

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» без необходимости подзапроса.

1 Ответ

0 голосов
/ 16 июня 2019

Последние несколько часов я боролся с этой же проблемой.Лучшее решение, которое я нашел, - это сделать следующее.Присоединяйтесь, сохраняя имена переменных одинаковыми.Затем, прежде чем вы материализуетесь, выберите только подмножество переменных, чтобы не было никакого перекрытия.

Итак, в вашем коде это будет выглядеть примерно так:

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

...