title: AWS Glue DynamicFrame tries to write empty string as null
body: <p>I have a AWS Glue Job moving data from RDS table to Redshift. </p>
  
  <p>both table has same schema:</p>
  
  <pre><code>-- RDS
  CREATE TABLE my_table (
     id varchar(256) not null primary key
     col1 varchar(256) not null
  ) 
  
  -- Redshift
  CREATE TABLE my_table (
     id varchar(256) not null 
     col1 varchar(256) not null
  ) sortkey(id)
  </code></pre>
  
  <p>I crawled both schemas and wrote a trivial job to write <code>DynamicFrame</code> from RDS source to Redshift sink. </p>
  
  <pre><code>val datasource = glueContext.getCatalogSource(
        database = "my_rds",
        tableName = "my_table",
        redshiftTmpDir = ""
      ).getDynamicFrame()
  
  glueContext.getCatalogSink(
        database = "my_redshift",
        tableName = "my_table",
        redshiftTmpDir = "s3://some-bucket/some-path"
      ).writeDynamicFrame(datasource)
  </code></pre>
  
  <p>but the job fails for rows with empty string values of <code>col1</code> with:</p>
  
  <pre><code>java.sql.SQLException:
  Error (code 1213) while loading data into Redshift: "Missing data for not-null field"
  Table name: my_table
  Column name: col1
  Column type: varchar(254)
  Raw line: 3027616797,@NULL@
  Raw field value: @NULL@
  </code></pre>
  
  <p>When I debug this with a <code>glue-spark-shell</code> I can verify that the value is an empty string <code>""</code>.</p>
  
  <pre><code>scala&gt; datasource.toDF().filter("id = '3027616797'").select("col1").collect().head.getString(0)
  res23: String = ""                                                              
  </code></pre>
  
  <p>How can I tell glue to distinguish between empty strings <code>""</code> and <code>NULL</code>s?</p>