我使用StructType定义了一个Schema,用于阅读Redsfhit中的数据的数据框。该表有350多个列,其中许多列被配置为Boolean。
从这个表中卸载数据后,我尝试使用我创建的Schema读取数据。但是我期望读取的每个BooleanType列都有“f”/“t”值。这导致解析异常。异常是:
java.lang.IllegalArgumentException: For input string: "f"
at scala.collection.immutable.StringLike$class.parseBoolean(StringLike.scala:290)
at scala.collection.immutable.StringLike$class.toBoolean(StringLike.scala:260)
at scala.collection.immutable.StringOps.toBoolean(StringOps.scala:30)
at org.apache.spark.sql.execution.datasources.csv.CSVTypeCast$.castTo(CSVInferSchema.scala:270)
at org.apache.spark.sql.execution.datasources.csv.CSVRelation$$anonfun$csvParser$3.apply(CSVRelation.scala:125)
at org.apache.spark.sql.execution.datasources.csv.CSVRelation$$anonfun$csvParser$3.apply(CSVRelation.scala:94)
at org.apache.spark.sql.execution.datasources.csv.CSVFileFormat$$anonfun$buildReader$1$$anonfun$apply$2.apply(CSVFileFormat.scala:167)
at org.apache.spark.sql.execution.datasources.csv.CSVFileFormat$$anonfun$buildReader$1$$anonfun$apply$2.apply(CSVFileFormat.scala:166)
....
有没有办法克服这个问题?我不喜欢将这些列定义为StringType,然后将它们中的每一个都转换为BooleanType。希望有一种方法可以修改parseBoolean函数。
- 一个不太受欢迎的解决方案也可以来自Redshift方面,卸载将为布尔解析提供具有有效值的布尔列。但同样,我不想为每一个布尔列都进入“Case When”语句。
先谢谢你了
1条答案
按热度按时间tp5buhyn1#
当你做
select <fields> FROM * ...
的时候,你可以使用case when <field>='f' then True else False end
结构,但是你必须把它应用到你想成为布尔值的每一列。