【问题标题】:Pyspark filter dataframe dynamicallyPyspark 动态过滤数据框
【发布时间】:2020-04-18 08:08:20
【问题描述】:

我想动态过滤输入数据框中的空值,因为值列可以来自 value(1) ... value(n)

输入数据框:

|dim1|dim2|TR_LIST|value1|value2|
| 101| 201|MTD0001|     1|    21|
| 101| 201|MTD0001|  null|  null|
| 101| 201|MTD0001|  null|  null|
| 102| 202|MTD0002|  null|  null|
| 102| 202|MTD0002|     2|    22|
| 102| 202|MTD0002|  null|  null|
| 103| 203|MTD0003|  null|  null|
| 103| 203|MTD0003|  null|  null|
| 103| 203|MTD0003|     3|    23|

输出数据框:

|dim1|dim2|TR_LIST|value1|value2|
| 101| 201|MTD0001|     1|    21|
| 102| 202|MTD0002|     2|    22|
| 103| 203|MTD0003|     3|    23|

我尝试在数据帧的过滤器方法中使用 for 循环进行过滤,但出现类似错误(它应该是 str 或 column)。

我尝试使用的命令行:

list_valiue = [value1, value2]  #Here i will be passing value columns as a list
df.filter(df.value.isNotNull() for value in list_value)  #Throwing an error

我也尝试了另一种方式:

df.where(" AND ".join([df.%s.isNotNull())"%(li) for li in list_value])).show()  # Even here I'm getting an error 

请提供我在上述查询中可能犯的任何错误

【问题讨论】:

    标签: python pyspark filter


    【解决方案1】:

    我不明白你在这个例子中动态是什么意思,但null 可以使用.isNull(你似乎知道)或dropna 删除。

    当有多个要检查的列时,第二种方法似乎更合适

    df = df.dropna(subset= ["value1", "value2"])
    

    默认方法是any,但您也可以使用all。见doc

    更一般地说,由于subset 参数,您可以根据需要添加任意数量的列。

    如果我误解了您的问题,请告诉我

    【讨论】:

      【解决方案2】:

      您可以像这样编写过滤器:

      from pyspark.sql import functions as sf
      
      columns_to_check = ['value1', 'value2']
      
      dynamic_filter = sf.col(columns_to_check[0]).isNotNull()
      
      for column in columns_to_check[1:]:
          dynamic_filter = dynamic_filter & sf.col(column).isNotNull()
      
      df.filter(dynamic_filter)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 2018-02-06
        • 2020-08-19
        • 2021-05-02
        相关资源
        最近更新 更多