#r #data.table #self-join #non-equi-join
Вопрос:
Я пытаюсь выполнить неравномерное объединение с data.table в таблице, содержащей 2 миллиона строк и 8 переменных. данные выглядят следующим образом:
db table :
product position_min position_max count_pos
A.16 167804 167870 20
A.18 167804 167838 15
A.15 167896 167768 18
A.20 238359 238361 33
A.35 167835 167837 8
dt table:
product_t position_min_t position_max_t count_pos_t
A.16 167804 167870 20
A.18 167804 167838 15
A.15 167896 167768 18
A.20 238359 238361 33
A.35 167835 167837 8
Вот код, который я использовал:
db_join <- db[dt, .(product, product_t, position_min_t, position_max_t, count_pos_t), on = .(position_min <= position_min_t, position_max >= position_max_t)]
Я должен получить:
A16 A18 167804 167838 15
A16 A15 167896 167768 18
A16 A35 167835 167837 8
A18 A35 167835 167837 8
но я продолжаю получать эту ошибку
Error in vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, :
Join results in more than 2^31 rows (internal vecseq reached physical limit). Very likely misspecified join. Check for duplicate key values in i each of which join to the same group in x over and over again. If that's ok, try by=.EACHI to run j for each group to avoid the large allocation. Otherwise, please search for this error message in the FAQ, Wiki, Stack Overflow and data.table issue tracker for advice.
Я установил значение allow.cartesian
TRUE и добавил by=.EACHI
, что это все еще не работает.
Я попробовал тот же код на подмножестве таблицы с 1,6 миллионами строк, и это сработало как заклинание.
У вас есть какие-нибудь идеи о том, как это исправить ?
Любая помощь была бы очень признательна
Комментарии:
1. Настройка
allow.cartesian=TRUE
не фиксирует слишком большие соединения, это просто механизм, позволяющий вам сказатьdata.table
, что вы в порядке с «взрывным количеством строк». Когда вы запустили его на вводе 1,6 млн строк, сколько строк вы получили? Есть ли что-то в удаленных 400 тыс. строк, что могло бы значительно изменить геометрию соединения?2. Спасибо вам за ваш ответ @r2evans. Я получаю 28 М строк при выполнении соединения в подмножестве 1,6 М. линии 400 Тыс. ничем не отличаются от 1,6 М. Я не вижу никакой разницы между 400 тыс. и 1,6 М.
3. Хотя я понимаю, что это не приведет к такой же ошибке с меньшими данными, можно ли предоставить репрезентативные выборочные данные, чтобы проверить, что делает механика соединения?
4. конечно, я отредактирую свой вопрос и добавлю образец данных
5. Даже если этот пример не генерирует эту ошибку, это тоже не соответствует вашим ожиданиям, возвращение 11 рядов вместо 4. На основе вашего вывода, я подразумеваю добавление
[product != product_t,]
после присоединения бы помочь, но что до сих пор производит пары у вас нет, а именноA.18
—A.15
иA.35
—A.15
, которые отвечают других ограничений. Можете ли вы расширить свои правила относительно того, почему эти две строки должны быть исключены? (Кстати, удаление » гдеproduct == product_t
» не исправит вашу ошибку, так как это сокращение после присоединения, не знаю, как лучше всего это учесть.)