Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
验证Python/PyTables中记录唯一性的有效方法_Python - Fatal编程技术网

验证Python/PyTables中记录唯一性的有效方法

验证Python/PyTables中记录唯一性的有效方法,python,Python,我在PyTables中有一个表,有大约5000万条记录。两个字段(特别是userID和date)的组合应该是唯一的(即,用户每天最多应该有一条记录),但我需要验证是否确实如此 举例来说,我的表格如下所示: userID | date A | 1 A | 2 B | 1 B | 2 B | 2 <- bad! Problem with the data! userID |日期 A | 1 A | 2 B

我在PyTables中有一个表,有大约5000万条记录。两个字段(特别是userID和date)的组合应该是唯一的(即,用户每天最多应该有一条记录),但我需要验证是否确实如此

举例来说,我的表格如下所示:

userID |   date
A      |    1
A      |    2
B      |    1
B      |    2
B      |    2   <- bad! Problem with the data!
userID |日期
A | 1
A | 2
B | 1
B | 2

B | 2我对PyTables了解不多,但我会尝试这种方法

  • 对于每个userID,获取所有
    (userID,date)
  • assert len(rows)==len(set(rows))
    如果
    列表中包含的所有
    (userID,date)
    元组都是唯一的,则此断言有效

  • PyTables中的索引似乎仅限于单列

    我建议添加一个哈希列并在其上添加索引。您的唯一数据定义为数据库中其他列的连接。分隔符将确保不会有两个不同的行生成相同的唯一数据。哈希列可以是这个唯一的字符串,但如果数据很长,则需要使用哈希函数。像md5或sha1这样的快速散列函数非常适合此应用程序


    计算散列数据并检查它是否在数据库中。如果是这样的话,你知道你碰到了一些重复的数据。如果没有,您可以安全地添加它。

    因此多年后,我仍然有同样的问题,但由于索引和查询功能的强大,这个问题只是稍微有点痛苦,这取决于您的表的大小。使用readWhere或getListWhere,我认为问题大约是O(n)

    这就是我所做的。。。 1.我创建了一个有两个标记的表。您可以在PyTables中使用多个标记:

    一旦您的表被打开,我还将使用LZO压缩,您可以执行以下操作:

    import tables
    h5f = tables.openFile('filename.h5')
    tbl = h5f.getNode('/data','data_table') # assumes group data and table data_table
    counter += 0
    
    for row in tbl:
        ts = row['date'] # timestamp (ts) or date
        uid = row['userID']
        query = '(date == %d) & (userID == "%s")' % (ts, uid)
        result = tbl.readWhere(query)
        if len(result) > 1:
            # Do something here
            pass
        counter += 1
        if counter % 1000 == 0: print '%d rows processed'
    
    现在我在这里写的代码实际上有点慢。我相信有一些PyTables大师可以给你一个更好的答案。但以下是我对绩效的看法:

    如果您知道您是从干净的数据开始的,即(没有重复数据),那么您所要做的就是查询表一次,查找您感兴趣的键,这意味着您只需执行以下操作:

    ts = row['date'] # timestamp (ts) or date
    uid = row['userID']
    query = '(date == %d) & (userID == "%s")' % (ts, uid)
    result = tbl.getListWhere(query)
    if len(result) == 0:
        # key pair is not in table
        # do what you were going to do
        pass
    elif len(result) > 1:
        # Do something here, like get a handle to the row and update instead of append.
        pass
    
    如果您有很多时间检查重复项,请创建一个后台进程,该进程将在目录中爬行您的文件并搜索重复项

    我希望这能帮助其他人