验证Python/PyTables中记录唯一性的有效方法
我在PyTables中有一个表,有大约5000万条记录。两个字段(特别是userID和date)的组合应该是唯一的(即,用户每天最多应该有一条记录),但我需要验证是否确实如此 举例来说,我的表格如下所示:验证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
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
如果您有很多时间检查重复项,请创建一个后台进程,该进程将在目录中爬行您的文件并搜索重复项
我希望这能帮助其他人