【问题标题】: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 RDSMySQL 数据库中读取数据。

它实际上也是从数据库中推断模式。不幸的是,表中的一列是TINYINT(1) 类型(列名:活动)。 active 列具有以下值:

  • 未激活
  • 有效
  • 待定

Spark 将 TINYINT(1) 识别为 BooleanType。所以他将active 中的所有值更改为truefalse。结果,我无法确定值。

加载表时是否可以强制定义架构?

【问题讨论】:

    标签: 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 2015-12-18
        • 1970-01-01
        相关资源
        最近更新 更多