繁体   English   中英

Pyspark 动态过滤 dataframe

[英]Pyspark filter dataframe dynamically

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

输入 Dataframe:

|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|

Output Dataframe:

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

我尝试使用 dataframe 的过滤方法中的 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 

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

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

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

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

默认方法是any但您也可以使用all 文档

更一般地说,由于subset参数,您可以根据需要尽可能多的列。

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

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM