code: def test_schema_by_write_and_read_csv(self):
      path = os.path.join(resource_path, "schema_csv/plain")
      test_schema = StructType(
          [
              StructField("language", StringType()),
              StructField("user", StringType()),
          ]
      )
  
      # write as plain csv file
      self.sc.write(self.df, CryptoMode.PLAIN_TEXT).mode(
          "overwrite"
      ).option("header", True).csv(path)
  
      # read from a plain csv file
      df = (
          self.sc.read(CryptoMode.PLAIN_TEXT)
          .option("header", "true")
          .schema(test_schema)
          .csv(path)
      )
  
      csv_content = "\n".join(
          [
              str(v["language"]) + "," + str(v["user"])
              for v in df.orderBy("language").collect()
          ]
      )
  
      self.assertEqual(csv_content, self.data_content)
  
file_path: BigDL/python/ppml/test/bigdl/ppml/test_ppml_context.py
imports: import unittest
  import os
  import random
  import shutil
  from bigdl.ppml.ppml_context import *
  from pyspark.sql.types import StructType, StructField, StringType
label_desc: Use image node_id 3 for calling the TestPPMLContext obj's underlying member method code with example usage: obj.test_schema_by_write_and_read_csv() without return types