【问题标题】:Is it possible to force schema definition when loading tables from AWS RDS (MySQL)从 AWS RDS (MySQL) 加载表时是否可以强制架构定义
【发布时间】:2017-07-17 18:42:17
【问题描述】:
我正在使用 Apache Spark 从 AWS RDS 的 MySQL 数据库中读取数据。
它实际上也是从数据库中推断模式。不幸的是,表中的一列是TINYINT(1) 类型(列名:活动)。 active 列具有以下值:
Spark 将 TINYINT(1) 识别为 BooleanType。所以他将active 中的所有值更改为true 或false。结果,我无法确定值。
加载表时是否可以强制定义架构?
【问题讨论】:
标签:
mysql
amazon-web-services
apache-spark
apache-spark-sql
【解决方案1】:
您可以定义一个模式,并在阅读时使用它
spark.read.schema(Schema)
Spark docs
如何定义架构的示例:
// The schema is encoded in a string
val schemaString = "name age"
// Generate the schema based on the string of schema
val fields = schemaString.split(" ")
.map(fieldName => StructField(fieldName, StringType, nullable = true))
val schema = StructType(fields)
现在您可以使用预定义的架构读取数据:
spark.read.schema(schema).function_to_read_data
【解决方案2】:
将TINYINT 类型转换为boolean 的不是spark,而是引擎盖下使用的j-connector。
因此,实际上您不需要为该问题指定架构。因为实际造成这种情况的是 jdbc 驱动程序将数据类型 TINYINT(1) 视为 BIT 类型(因为服务器在创建表时静默转换 BIT -> TINYINT(1))。
您可以在 MySQL official Connector/J Configuration Properties guide 中查看 jdbc 连接器的所有提示和陷阱。
您只需要通过将以下内容添加到您的 url 连接来为您的 jdbc 连接器传递正确的参数:
val newUrl = s"$oldUrl&tinyInt1isBit=false"
val data = spark.read.format("jdbc")
.option("url", newUrl)
// your other jdbc options
.load