Как сравнить ячейки из разных строк в одном проекте в OpenRefine - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть набор данных со столбцом с именем START, содержащим значения даты.

Можно ли сравнить значение START строки со всеми другими значениями START внутри проекта?

Я хотел бы создать новый столбец с таким сообщением "Rows n° x,y,...,z contains greater START values".

Я попробовал следующее, используя функцию "cell.cross" для сравнения двух проектов (фактически одного и того же проекта).) но, похоже, это слишком ресурсоемко и требует много времени:

1. create a new column COMPARE with a fixed value
2. use "cell.cross" function against column COMPARE to import in every row all the START values of the project, collapsed in a new column named ALL_START_VALUES
3. compare START value against the array in ALL_START_VALUES and generate log

Жаль, что мой проект на 200 тыс. строк зависает на шаге № 2.

Это то, что я хотел бы получить:

ROW |СТАРТ |LOG

0 |2019-01- 01 T00: 00: 00Z |Строки № 1,2 содержат большие значения START

1 |2019-01- 02 T00: 00: 00Z |Строки № 2 содержат большие значения START

2 |2019-01- 03 T00: 00: 00Z |

Ответы [ 3 ]

0 голосов
/ 25 сентября 2019

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

Если вы хотите проверять значения в столбце, который содержит даты или текст или что-то еще, вы можете применять различные аспекты, используя меню столбцов.Как говорит Этторе, у вас могут возникнуть проблемы, если набор данных, с которым вы работаете, состоит из миллионов или миллиардов строк (для этого может потребоваться много оперативной памяти, выделенной для OpenRefine).

Ваш вариант использования может быть ближе кнужна база данных, которая поддерживает функции.В мире RDBMS я бы предложил PostgreSQL.https://www.postgresql.org/docs/9.6/plpgsql.html

0 голосов
/ 25 сентября 2019

OpenRefine не поддерживает операции, которые работают между несколькими строками.Вы можете использовать режим «Записи», чтобы достичь этого в определенной степени, но у вас будут проблемы с производительностью, если вы попытаетесь создать запись, содержащую 200 тыс. Строк.

Так что я подозреваю, что OpenRefine - не лучший инструмент длярешить эту проблему

С точки зрения того, как вы на самом деле подходите к проблеме в целом - кажется, что это действительно проблема "сортировки" - если вы сортируете строки на основе даты в столбце START, то каждая строканиже, который содержит большую или равную дату начала.Оттуда было бы достаточно легко сгенерировать нужные операторы в столбце LOG - работая внизу столбца START, вам просто нужно найти первую строку, содержащую более позднюю дату, а затем вы знаете все строки, которые также содержат более позднююсвидание.(Я вижу способ сделать это в OpenRefine, но это довольно сложно - я не думаю, что это лучшее решение)

Надеюсь, это поможет

0 голосов
/ 24 сентября 2019

Если я правильно понял, ваш шаг 2 включает создание проекта, содержащего 200 000 ячеек, содержащих по 200 000 элементов, то есть 200 000 ^ 2 = 40 миллиардов элементов <- это слишком много для решения OpenRefine. </p>

Тогда вам нужно будет сделать еще 40 миллиардов вычислений, чтобы сравнить каждую из ваших 200 000 дат с другими 200 000.При расчете в 1 миллисекунду для расчета это составит 1111 часов расчета или 462 дня ...

Вам определенно необходим другой инструмент, кроме OpenRefine ( пример в Python ).И в любом случае вам нужно будет разработать методику, позволяющую сократить количество сравнений.Наиболее распространенным в этом типе случаев является блокировка .Он заключается в сравнении только тех значений, которые уже достаточно близки (например, только даты того же года).Но сложно предложить стратегию, не зная ваших данных.

...