如何在pyspark中过滤布尔值列

时间:2019-09-20 14:01:12

标签: pyspark

我有一个包含布尔列的sql表。 示例my_table

column_1   column_2  column_3 column_4
-----------------------------------------
AA         BB         CC       false
---------------------------------------
CC         FF          JJ      true

我只想在条件column_1下选择column_2column_4=true来创建新的dataset

我提取新数据集的代码:

def create_dataset(my_table):
    output = (
        my_table.select(
            F.col('column_1').alias('first_name'),
            F.col('column_2').alias('last_name'))
        .withColumn('first_name', F.when(F.col('first_name').isin(["NULL", None, ""]), None).otherwise(F.col('first_name')))
        .withColumn('last_name', F.when(F.col('last_name').isin(["NULL", None, ""]), None).otherwise(F.col('last_name')))        
    )
    return output

我添加了一个过滤器,以将column_4 is true所在的行作为行。

我的新代码:

def create_dataset(my_table):
    output = (
        my_table.select(
            F.col('column_1').alias('first_name'),
            F.col('column_2').alias('last_name')).where("column_4"=true)
        .withColumn('first_name', F.when(F.col('first_name').isin(["NULL", None, ""]), None).otherwise(F.col('first_name')))
        .withColumn('last_name', F.when(F.col('last_name').isin(["NULL", None, ""]), None).otherwise(F.col('last_name')))        
    )
    return output

当我在哪里使用时,出现此错误:

keyword can't be an expression

如何根据布尔值column_4 =true过滤数据? 谢谢

2 个答案:

答案 0 :(得分:1)

这是一个布尔列。因此,它在where子句或when子句中有效。

df.show()                                                                                                          
+---+-----+                                                                     
| id| bool|
+---+-----+
|  1| true|
|  2|false|
+---+-----+


df.printSchema()                                                                                                   
root
 |-- id: long (nullable = true)
 |-- bool: boolean (nullable = true)


df.where("bool").show() # or df.where(F.col("bool")).show()
+---+----+
| id|bool|
+---+----+
|  1|true|
+---+----+


df.select(F.when(F.col('bool'), 'bar').otherwise("foo")).show()                                                  
+------------------------------------+                                          
|CASE WHEN bool THEN bar ELSE foo END|
+------------------------------------+
|                                 bar|
|                                 foo|
+------------------------------------+


答案 1 :(得分:0)

这应该有效:output_df = my_table.filter(my_table.column_4 == True).select('column_1', 'column_2')