如何在OpenRefine中比较同一项目中不同行的单元格

时间:2019-09-24 10:55:58

标签: openrefine

我有一组数据,其中包含名为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

太糟糕了,我的20万行项目在第2步中冻结。

这就是我想要获得的:

  

行|开始|日志

     

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 :(得分:0)

如果我理解正确,那么您的第2步涉及创建一个包含200,000个单元格的项目,每个单元格包含200,000个元素,即200,000 ^ 2 = 400亿个元素<-对于OpenRefine来说,处理太多了。

这时,您将需要再进行400亿次计算,才能将200,000个日期中的每个日期与其他200,000个日期进行比较。以每次计算1毫秒的速度计算,这将需要1111个小时的计算时间,即462天...

您肯定需要除OpenRefine(example in Python)之外的其他工具。而且无论如何,您都需要开发一种减少比较次数的技术。这种情况下最常见的是blocking。它包括仅比较已经足够接近的值(例如,仅比较具有相同年份的日期)。但是,在不了解您的数据的情况下很难提出策略。

答案 1 :(得分:0)

OpenRefine是一种数据清理功能强大的工具,可以从数据库导入和导出表格数据,但它本身不是数据库。

如果要检查包含日期或文本或其他内容的列上的值,则可以使用列菜单应用各种Facet。正如Ettore所说,如果您正在使用的数据集是数百万或数十亿行(可能需要为OpenRefine分配大量RAM),您可能会遇到麻烦。

您的用例可能更接近需要支持功能的数据库的用例。在RDBMS世界中,我建议使用PostgreSQL。 https://www.postgresql.org/docs/9.6/plpgsql.html

答案 2 :(得分:0)

OpenRefine不容易支持在多行之间工作的操作。您可以使用“记录”模式在一定程度上实现此目的,但是如果您尝试创建一个包含200k行的记录,则会遇到性能问题。

所以我怀疑OpenRefine不是您解决此问题的最佳工具

从整体上实际解决问题的方式来看-确实这是一个“排序”问题-如果您根据START列中的日期对行进行排序,则下面的每一行包含大于或等于开始日期。从那里开始,在LOG列中生成所需的语句将相当容易-在START列下工作,您只需找到包含一个较晚日期的第一行,然后您知道该行下的所有行也包含一个较晚的日期日期。 (我可以在OpenRefine中看到实现此目的的一种方法,但这非常复杂-我认为这不是最好的解决方案)

希望这对您有所帮助