code: def test_drop_columns(ray_start_regular_shared, tmp_path):
      df = pd.DataFrame(
          {"col1": [1, 2, 3], "col2": [2, 3, 4], "col3": [3, 4, 5]}
      )
      ds1 = ray.data.from_pandas(df)
      ds1.write_parquet(str(tmp_path))
      ds2 = ray.data.read_parquet(str(tmp_path))
  
      for ds in [ds1, ds2]:
          assert ds.drop_columns(["col2"]).take(1) == [
              {"col1": 1, "col3": 3}
          ]
          assert ds.drop_columns(["col1", "col3"]).take(1) == [
              {"col2": 2}
          ]
          assert ds.drop_columns([]).take(1) == [
              {"col1": 1, "col2": 2, "col3": 3}
          ]
          assert ds.drop_columns(["col1", "col2", "col3"]).take(1) == [
              {}
          ]
          assert ds.drop_columns(["col1", "col1", "col2", "col1"]).take(
              1
          ) == [{"col3": 3}]
          # Test dropping non-existent column
          with pytest.raises(KeyError):
              ds.drop_columns(
                  ["dummy_col", "col1", "col2"]
              ).materialize()
  
imports: import itertools
  import math
  import os
  import signal
  import threading
  import time
  from typing import Iterator
  import numpy
  import pandas
  import pyarrow
  import pyarrow.parquet
  import pytest
  import ray
  from ray._private.test_utils import wait_for_condition
  from ray.data.block import BlockAccessor
  from ray.data.context import DataContext
  from ray.data.tests.conftest import *
  from ray.data.tests.util import column_udf, column_udf_class, extract_values
  from ray.tests.conftest import *
label_desc: Use image node_id 8 for calling a global function with example usage: test_drop_columns(ray_start_regular_shared, tmp_path) without return types