我正在使用apache spark从 mySQL 数据库中读取来自 aws aws rds rds 的数据。
实际上也从数据库中推断了架构。不幸的是,该表的列之一是类型TINYINT(1)
(列名称:Active)。active
列具有以下值:
- 非活动
- 活动
- 未决
- 等。
Spark将TINYINT(1)
识别为 booleantype 。因此,他将active
中的所有值更改为true
或false
。结果,我无法识别值。
在加载表发射时是否可以强制架构定义?
不是 spark 将TINYINT
类型转换为boolean
,而是引擎盖下使用的J-Connector。
因此,实际上,您无需为该问题指定架构。因为实际引起的是将数据类型TINYINT(1)
视为BIT
类型的JDBC驱动程序(因为服务器在创建表时默默转换BIT
-> TINYINT(1)
)。
您可以检查MySQL官方连接器/J配置属性指南中JDBC连接器的所有提示和捕获。
您只需要通过在URL连接中添加以下内容来传递JDBC连接器的正确参数:
val newUrl = s"$oldUrl&tinyInt1isBit=false"
val data = spark.read.format("jdbc")
.option("url", newUrl)
// your other jdbc options
.load
您可以定义模式,并在使用
阅读时使用它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