将 Spark 数据帧写入 Redshift:保存 StructField(user_agent,ArrayType(StringType,true),true)

Posted

技术标签:

【中文标题】将 Spark 数据帧写入 Redshift:保存 StructField(user_agent,ArrayType(StringType,true),true)【英文标题】:Write Spark dataframe to Redshift:save StructField(user_agent,ArrayType(StringType,true),true) 【发布时间】:2016-06-03 19:57:13 【问题描述】:

我有一个数据框,架构包含一个 Array[String] 字段:

 StructField("user_agent", ArrayType apply (StringType, true))

   ...
   myDataframe.printSchema
(an excerpt)
 |-- user_agent: array (nullable = true)
 |    |-- element: string (containsNull = true)

我正在使用 com.databricks.spark.redshift 包写入 Redshift。我收到一个错误:

java.lang.IllegalArgumentException: Don't know how to save StructField(user_agent,ArrayType(StringType,true),true) to JDBC
        at com.databricks.spark.redshift.JDBCWrapper$$anonfun$schemaString$1.apply(RedshiftJDBCWrapper.scala:253)
        at com.databricks.spark.redshift.JDBCWrapper$$anonfun$schemaString$1.apply(RedshiftJDBCWrapper.scala:233)

是否可以使用这个包将这样的数据类型写入 Redshift?

【问题讨论】:

我遇到了同样的问题,最终将数组转换为字符串。 【参考方案1】:

spark-redshift 支持以下数据类型:

field.dataType match 
          case IntegerType => "INTEGER"
          case LongType => "BIGINT"
          case DoubleType => "DOUBLE PRECISION"
          case FloatType => "REAL"
          case ShortType => "INTEGER"
          case ByteType => "SMALLINT" // Redshift does not support the BYTE type.
          case BooleanType => "BOOLEAN"
          case StringType =>
            if (field.metadata.contains("maxlength")) 
              s"VARCHAR($field.metadata.getLong("maxlength"))"
             else 
              "TEXT"
            
          case TimestampType => "TIMESTAMP"
          case DateType => "DATE"
          case t: DecimalType => s"DECIMAL($t.precision,$t.scale)"
          case _ => throw new IllegalArgumentException(s"Don't know how to save $field to JDBC")

Source

【讨论】:

以上是关于将 Spark 数据帧写入 Redshift:保存 StructField(user_agent,ArrayType(StringType,true),true)的主要内容,如果未能解决你的问题,请参考以下文章

Spark Job 卡住了将数据帧写入分区 Delta 表

将大型 Spark 数据帧从数据块写入 csv 失败

将 Spark 数据帧写入带分区的 CSV

将 Spark 数据帧写入带分区的 CSV

将 spark 数据帧写入 postgres 数据库

如何将 Spark 数据帧写入 impala 数据库