PySpark-当值为“时,如何使用模式读取BooleanType”;";及;f";

PySpark-当值为“时,如何使用模式读取BooleanType”;";及;f";,pyspark,boolean,spark-dataframe,amazon-redshift,Pyspark,Boolean,Spark Dataframe,Amazon Redshift,我使用StructType定义了一个模式,用于读取我在Redsfhit中拥有的数据的数据帧。该表有350多列,其中许多列配置为布尔值 从这个表中卸载数据之后,我尝试使用我创建的模式读取数据。但我希望看到的每一个布尔型列都有“f”/“t”值。这会导致解析异常。例外情况是: java.lang.IllegalArgumentException: For input string: "f" at scala.collection.immutable.StringLike$class.parseBool

我使用StructType定义了一个模式,用于读取我在Redsfhit中拥有的数据的数据帧。该表有350多列,其中许多列配置为布尔值

从这个表中卸载数据之后,我尝试使用我创建的模式读取数据。但我希望看到的每一个布尔型列都有“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函数

*另一个不太受欢迎的解决方案也可以来自红移端,即卸载将为布尔列提供用于布尔解析的有效值。但是,我不想对每一个布尔列都使用“Case-When”语句


提前感谢

当您从*.中选择时,您可以使用
case When='f'然后True else False end
构造,但您必须将其应用于希望为布尔值的每一列。另一种方法是将所有内容加载到dataframe,运行map函数或udf,并应用新模式。。。正如我提到的,我希望在查询中不要使用case,除非它是最后一个选项。关于映射-我认为最好还是使用数据帧,而不是只针对该映射切换到rdd,而不是返回到数据帧。仍然希望有人对解析本身有一个绝妙的想法:)你想出了一个好的解决方案吗?我现在有一个类似的问题。。。我认为卸载清单VERBOSE,然后解析清单文件,以获得比InferreSchema更好的模式。