2017-11-22 2 views
1

Redstfhitにあるデータのデータフレームを読み込むために、StructTypeを使用してスキーマを定義しました。表には350以上の列があり、その多くはブール値として構成されています。PySpark - 値が "t"と "f"のときにスキーマを使用してBooleanTypeを読み取る方法

このテーブルからデータをアンロードした後、作成したスキーマを使用してデータを読み込もうとしています。しかし、私が読もうとしているすべての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 <field>='f' then True else False end建設を使用することができますselect <fields> FROM * ...行う事前

答えて

0

でのおかげで、しかし、あなたはブール値になりたいすべての列に適用する必要があります。もう1つの方法は、データフレームにすべてをロードし、マップ関数またはudfを実行して新しいスキーマを適用することです。

+0

まあ...私が言及したように、最後のオプションでない限り、クエリには使用しないことを願っています。 マッピングについて - このマップではrddに、データフレームに戻るのではなく、データフレームにとどまる方が良いと思います。 まだ解析自体に関して華麗なアイデアを持っている誰かを願っています:) – JustinCase

関連する問題