docstr: Read the input csv file using pandas and persist data
  using storage engine
docstr_tok: ["Read","the","input","csv","file","using","pandas","and","persist","data","using","storage","engine"]
code: def exec(self, *args, **kwargs):
      """
      Read the input csv file using pandas and persist data
      using storage engine
      """
  
      # Check table existence
      table_info = self.node.table_info
      database_name = table_info.database_name
      table_name = table_info.table_name
      table_obj = self.catalog().get_table_catalog_entry(
          table_name,
          database_name,
      )
      if table_obj is None:
          error = f"{table_name} does not exist."
          logger.error(error)
          raise ExecutorError(error)
  
      # Get the column information
      column_list = []
      for column in table_obj.columns:
          column_list.append(
              TupleValueExpression(
                  name=column.name,
                  table_alias=table_obj.name.lower(),
                  col_object=column,
              )
          )
  
      # Read the CSV file
      # converters is a dictionary of functions that convert the values
      # in the column to the desired type
      csv_reader = CSVReader(
          self.node.file_path,
          column_list=column_list,
          batch_mem_size=self.node.batch_mem_size,
      )
  
      storage_engine = StorageEngine.factory(self.db, table_obj)
      # write with storage engine in batches
      num_loaded_frames = 0
      for batch in csv_reader.read():
          storage_engine.write(table_obj, batch)
          num_loaded_frames += len(batch)
  
      # yield result
      df_yield_result = Batch(
          pd.DataFrame(
              {
                  "CSV": str(self.node.file_path),
                  "Number of loaded rows": num_loaded_frames,
              },
              index=[0],
          )
      )
  
      yield df_yield_result
  
file_path: evadb/evadb/executor/load_csv_executor.py
imports: import pandas
  from evadb.database import EvaDBDatabase
  from evadb.executor.abstract_executor import AbstractExecutor
  from evadb.executor.executor_utils import ExecutorError
  from evadb.expression.tuple_value_expression import TupleValueExpression
  from evadb.models.storage.batch import Batch
  from evadb.plan_nodes.load_data_plan import LoadDataPlan
  from evadb.readers.csv_reader import CSVReader
  from evadb.storage.storage_engine import StorageEngine
  from evadb.utils.logging_manager import logger
label_desc: Use image node_id 2 for calling the LoadCSVExecutor obj's underlying member method code with example usage: obj.exec() without return types