Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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从Bigtable中获取过滤数据?_Python_Bigtable_Google Cloud Bigtable - Fatal编程技术网

如何使用Python从Bigtable中获取过滤数据?

如何使用Python从Bigtable中获取过滤数据?,python,bigtable,google-cloud-bigtable,Python,Bigtable,Google Cloud Bigtable,我正在使用Bigtable emulator,并且已经成功地在其中添加了一个表,现在我需要获得过滤后的数据 下表如下: arc_record_id | record_id | batch_id 1 |624 |86 2 |625 |86 3 |626 |86 以此类推…直到arc_记录id 10 我尝试了以下Python代码: 访问\u dt\u filter=ValueRang

我正在使用Bigtable emulator,并且已经成功地在其中添加了一个表,现在我需要获得过滤后的数据

下表如下:

arc_record_id | record_id | batch_id
1             |624        |86
2             |625        |86
3             |626        |86 
以此类推…直到arc_记录id 10

我尝试了以下Python代码:

访问\u dt\u filter=ValueRangeFilterstart\u value=1.编码“utf-8”, end_值=2。编码为“utf-8” col1\u filter=columnqualifier regexfilterb'arc\u record\u id' chain1=行过滤器chainfilters=[col1\u过滤器,访问\u dt\u过滤器] 部分行=测试表。读取行筛选器=链1 对于部分_行中的行: 单元格=行。单元格[columnFamilyid1][arc_记录\u id.编码'utf-8'][0] printcell.value.decode'utf-8' rowkey是

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

代码中有几个问题可以帮助您实现所需:

Bigtable使用,因此排序顺序为1、10、2、3等等。这就是结果集中包含10的原因。您可以通过左键填充数字来修复此问题,以便将其存储为000000001000000002。您可以通过以十六进制甚至二进制存储来降低这方面的效率

因为您只打印row.cells[columnFamilyid1][arc_record_id.encode'utf-8'],所以您只输出arc_record_id

因为要筛选的列是行键,所以直接告诉read\u rows要读取的范围既简单又高效:read\u rowsstart\u key=RecordArchive1.encode'utf-8',end\u key=RecordArchive3.encode'utf-8'

总之,请尝试以下代码:

KEY\u PREFIX=RecordArchive.编码为“utf-8” ARC_记录_ID_COL=ARC_记录_ID.编码为“utf-8” 记录\u ID\u COL=记录\u ID.编码为“utf-8” 批次识别号=批次识别号。编码为“utf-8” 用于存储/检索整数值的函数。支持高达2**31的ID def组件内部: 返回结构pack'>l',i def unpack_intb: 返回结构解包'>l',b[0] 给定弧记录id的记录的行键 def rowkeyid: 返回键前缀+打包初始化 结果=表格。读取\u行开始\u键=行键1,结束\u键=行键2,结束\u包含=真 打印弧记录id、记录id、批次id 对于结果中的行: 打印{},{},{}.format 解包\u introw.cell[columnFamilyid1][ARC\u RECORD\u ID\u COL][0]。值, 解包\u introw.cell[columnFamilyid1][RECORD\u ID\u COL][0]。值, 解包\u introw.cell[columnFamilyid1][BATCH\u ID\u COL][0]。值
您从查询中得到了什么输出?它有用吗?行键是什么?@David请检查更新的问题。如果我想使用record\u id have record\u id 625读取行,那么读取行的代码是什么?由于record\u id不是rowkey,因此需要进行表扫描,即使用筛选器读取行。我使用visit\u dt\u filter=ValueRangeFilterstart\u value=626,end\u value=626作为col1\u filter=ColumnQualifierRegexFilterRECORD\u id\u COL列,但我只得到该record\u id\u COL列。我想要记录为626的所有列。如何使用筛选器获取所有列?这就像我想从RECORD\u ID\u COL=626的表中查询select*。它非常难看:使用条件RowFilterBase\u filter=RowFilterChainfilters=[ColumnRangeFilterstart\u column=RECORD\u ID\u COL,end\u column=RECORD\u ID\u COL,ValueRangeFilterstart\u filter=pack\u int626],true\u filter=PassAllFilter