code: def merge_sorted_blocks(
      blocks: List[Block], sort_key: "SortKey"
  ) -> Tuple["pandas.DataFrame", BlockMetadata]:
      pd = lazy_import_pandas()
      stats = BlockExecStats.builder()
      blocks = [b for b in blocks if b.shape[0] > 0]
      if len(blocks) == 0:
          ret = PandasBlockAccessor._empty_table()
      else:
          ret = pd.concat(blocks, ignore_index=True)
          columns, ascending = sort_key.to_pandas_sort_args()
          ret = ret.sort_values(by=columns, ascending=ascending)
      return ret, PandasBlockAccessor(ret).get_metadata(
          None, exec_stats=stats.build()
      )
  
imports: import collections
  import heapq
  from typing import TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Tuple, TypeVar, Union
  import numpy
  from ray.air.constants import TENSOR_COLUMN_NAME
  from ray.data._internal.table_block import TableBlockAccessor, TableBlockBuilder
  from ray.data._internal.util import find_partitions
  from ray.data.block import Block, BlockAccessor, BlockExecStats, BlockMetadata, KeyType, U
  from ray.data.context import DataContext
  from ray.data.row import TableRow
label_desc: Use image node_id 28 for calling the PandasBlockAccessor obj's underlying member method code with example usage: obj.merge_sorted_blocks(blocks, sort_key) and returns: ret,  PandasBlockAccessor