我正在使用BigTable模拟器,并且已在其中成功添加了一个表,现在我需要获取过滤后的数据。
表如下。
arc_record_id | record_id | batch_id
1 |624 |86
2 |625 |86
3 |626 |86
以此类推...直到arc_record_id10。
我已经尝试了下面的python代码给出的->
visit_dt_filter = ValueRangeFilter(start_value = "1".encode('utf-8'),
end_value = "2".encode('utf-8'))
col1_filter = ColumnQualifierRegexFilter(b'arc_record_id')
chain1 = RowFilterChain(filters=[col1_filter, visit_dt_filter])
partial_rows = testTable.read_rows(filter_=chain1)
for row in partial_rows:
cell = row.cells[columnFamilyid1]["arc_record_id".encode('utf-8')][0]
print(cell.value.decode('utf-8'))
行键是
prim_key=row_value[0] //which is arc_record_id
row_key="RecordArchive{}".format(prim_key).encode('utf-8')
我得到的输出为
1
10
2
3
我希望输出是
arc_record_id | record_id | batch_id
1 |624 |86
2 |625 |86
答案 0 :(得分:1)
您的代码存在一些问题,可帮助您实现所需的目标:
BigTable使用lexicographic sort over arbitrary bytes,因此排序顺序为1、10、2、3,依此类推。这就是为什么结果集中包含10个的原因。您可以通过对数字进行左填充来解决此问题,以便将它们存储为000000001、000000002。(您可以通过以十六进制甚至二进制存储的方式来降低其效率)。
因为只打印row.cells[columnFamilyid1]["arc_record_id".encode('utf-8')]
,所以只输出arc_record_id。
由于要过滤的列是行键,因此直接告诉read_rows要读取的范围既简单又有效:read_rows(start_key="RecordArchive1".encode('utf-8'), end_key="RecordArchive3".encode('utf-8'))
总而言之,尝试如下代码:
KEY_PREFIX = "RecordArchive".encode('utf-8')
ARC_RECORD_ID_COL = "arc_record_id".encode('utf-8')
RECORD_ID_COL = "record_id".encode('utf-8')
BATCH_ID_COL = "batch_id".encode('utf-8')
# Functions used to store/retrieve integer values. Supports IDs up to 2**31
def pack_int(i):
return struct.pack('>l', i)
def unpack_int(b):
return struct.unpack('>l', b)[0]
# row key of a record of given arc_record_id
def rowkey(id):
return KEY_PREFIX + pack_int(id)
results = table.read_rows(start_key=rowkey(1), end_key=rowkey(2), end_inclusive=True)
print("arc_record_id,record_id,batch_id")
for row in results:
print("{},{},{}".format(
unpack_int(row.cell[columnFamilyid1][ARC_RECORD_ID_COL][0].value),
unpack_int(row.cell[columnFamilyid1][RECORD_ID_COL][0].value),
unpack_int(row.cell[columnFamilyid1][BATCH_ID_COL][0].value)))