Как отфильтровать логический столбец в pyspark - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть таблица SQL, которая содержит логический столбец.Пример my_table:

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

Я хочу выбрать только column_1 и column_2 в условии column_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 ]

1 голос
/ 20 сентября 2019

Это логический столбец.Следовательно, он действителен в предложении 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|
+------------------------------------+


0 голосов
/ 20 сентября 2019

Это должно работать: output_df = my_table.filter(my_table.column_4 == True).select('column_1', 'column_2')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...