我使用StructType定义了一个Schema,用于读取我在Redsfhit中拥有的数据的数据帧。该表有350多列,其中许多列配置为布尔值。
从此表中卸载数据后,我尝试使用我创建的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"每个布尔列的语句。
提前致谢
答案 0 :(得分:0)
执行select <fields> FROM * ...
时,您可以使用case when <field>='f' then True else False end
构造,但必须将其应用于您想要布尔的每一列。另一种方法是将所有内容加载到数据帧,运行map函数或udf并应用新架构