@@ -253,9 +253,16 @@ def _(
253253 value_generator = iter_array (
254254 array .flatten (), bigframes .dtypes .get_array_inner_type (dtype )
255255 )
256- for (start , end ) in _pairwise (array .offsets ):
257- arr_size = end .as_py () - start .as_py ()
258- yield list (itertools .islice (value_generator , arr_size ))
256+ offset_generator = iter_array (array .offsets , bigframes .dtypes .INT_DTYPE )
257+
258+ start_offset = None
259+ end_offset = None
260+ for offset in offset_generator :
261+ start_offset = end_offset
262+ end_offset = offset
263+ if start_offset is not None :
264+ arr_size = end_offset - start_offset
265+ yield list (itertools .islice (value_generator , arr_size ))
259266
260267 @iter_array .register
261268 def _ (
@@ -267,8 +274,15 @@ def _(
267274 sub_generators [field_name ] = iter_array (array .field (field_name ), dtype )
268275
269276 keys = list (sub_generators .keys ())
270- for row_values in zip (* sub_generators .values ()):
271- yield {key : value for key , value in zip (keys , row_values )}
277+ is_null_generator = iter_array (array .is_null (), bigframes .dtypes .BOOL_DTYPE )
278+
279+ for values in zip (is_null_generator , * sub_generators .values ()):
280+ is_row_null = values [0 ]
281+ row_values = values [1 :]
282+ if not is_row_null :
283+ yield {key : value for key , value in zip (keys , row_values )}
284+ else :
285+ yield None
272286
273287 for batch in table .to_batches ():
274288 sub_generators : dict [str , Generator [Any , None , None ]] = {}
@@ -491,16 +505,3 @@ def _schema_durations_to_ints(schema: pa.Schema) -> pa.Schema:
491505 return pa .schema (
492506 pa .field (field .name , _durations_to_ints (field .type )) for field in schema
493507 )
494-
495-
496- def _pairwise (iterable ):
497- do_yield = False
498- a = None
499- b = None
500- for item in iterable :
501- a = b
502- b = item
503- if do_yield :
504- yield (a , b )
505- else :
506- do_yield = True
0 commit comments