J'ai trois colonnes dans mon bloc de données. Dans ce deuxième et troisième sont des champs booléens. Je veux filtrer les valeurs qui sont vraies. J'ai essayé celui-ci nn.filter (col ("col3") === true) .show
mais il indique que le nom de colonne n'est pas valide "true". qu'est-ce qui est porté avec mon code? Est-ce que quelque chose vous aide s'il vous plaît?
mes codes:
scala> nn.printSchema root |-- ID: integer (nullable = true) |-- col2: boolean (nullable = true) |-- col3: boolean (nullable = true) scala> nn.show +---+-----+-----+ | ID| col2| col3| +---+-----+-----+ | 4| true|false| | 5|false|false| | 6|false|false| | 7|false|false| | 12|false|false| | 13|false|false| | 14|false|false| | 15|false| true| | 16|false|false| | 17|false|false| | 18|false|false| | 22|false|false| | 36|false|false| | 37|false|false| | 38|false|false| | 39|false|false| | 40|false|false| | 41| true|false| | 42|false|false| +---+-----+-----+ scala> nn.filter(col("col3")===true).show [Stage 14:> (0 + 1) / 1]19/05/26 22:44:16 ERROR executor.Executor: Exception in task 0.0 in stage 14.0 (TID 14) com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'true'. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:217) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1655) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:440) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:385) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7505) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2445) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:191) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:166) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:297) at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD.compute(JDBCRDD.scala:301) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324) at org.apache.spark.rdd.RDD.iterator(RDD.scala:288) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324) at org.apache.spark.rdd.RDD.iterator(RDD.scala:288) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324) at org.apache.spark.rdd.RDD.iterator(RDD.scala:288) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324) at org.apache.spark.rdd.RDD.iterator(RDD.scala:288) at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) at org.apache.spark.scheduler.Task.run(Task.scala:109) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
3 Réponses :
Vous pouvez appliquer directement le filtre sur la valeur booléenne. Pourquoi appliquez-vous une condition dessus comme col ("col3") === true
? La valeur de votre colonne est de type booléen et lorsque nous appliquons à une condition dans le filtre, elle renvoie la valeur en booléen soit true
ou false
. Lorsque votre colonne est booléenne, pourquoi essayez-vous de nouveau la même chose?
scala> someDf.filter(col("col3")).show +----+----+----+ |col1|col2|col3| +----+----+----+ | 2|true|true| +----+----+----+
Nous avons DF avec la valeur:
scala> someDf.show +----+----+-----+ |col1|col2| col3| +----+----+-----+ | 1|true|false| | 2|true| true| +----+----+-----+
Maintenant, appliquez le filtre:
scala> val someDf = Seq((1, true, false), (2, true, true)).toDF("col1", "col2", "col3") someDf: org.apache.spark.sql.DataFrame = [col1: int, col2: boolean ... 1 more field]
Merci.
===
est redéfini comme Column.scala
( référence au code Spark )
La méthode overriden est appelée dans votre cas.
Pour éviter cela,
1. Ajoutez un espace après l'objet de colonne comme nn.filter (col ("col3") === true)
(espace après col ("col3")
) ou
2. Utilisez la méthode suggérée par @Learner comme nn.filter(col("col3"))
import spark.implicits._ val someDf = Seq((1, true, false), (2, true, true)).toDF("col1", "col2", "col3") someDf.show() import org.apache.spark.sql.functions._ someDf.filter(col("col3")===true).show() Original DataFrame : +----+----+-----+ |col1|col2| col3| +----+----+-----+ | 1|true|false| | 2|true| true| +----+----+-----+ Filtered Dataframe : +----+----+----+ |col1|col2|col3| +----+----+----+ | 2|true|true| +----+----+----+