Pyspark:具有.isNotNull()和其他2个其他条件的过滤器函数错误

时间:2019-08-23 13:14:21

标签: python apache-spark pyspark

我尝试在dataframe中过滤我的Pyspark,但我想将结果写入新的parquet-File中,但是我总是遇到错误,因为我的东西出了问题isNotNull()-条件。我为filter function有3个条件,并且是其中之一,给出的行应以新的parquet-file形式写出。

我尝试使用OR|的不同版本,以及具有isNotNull()功能的不同版本,但没有任何帮助。

这是我绑的一个例子:

from pyspark.sql.functions import col

df.filter((df['col1']=='attribute1')|(df['col1']=='attribute2')|(df.where(col("col2").isNotNull())))\
    .write \
    .save("new_parquet.parquet")

这是我绑定的另一个示例,但是在该示例中,它忽略了带有attribute1attribute2的行:

df.filter((df['col1']=='attribute1')|(df['col1']=='attribute2')|(df['col2'].isNotNull()'))\
    .write \
    .save("new_parquet.parquet")

这是错误消息:

  

AttributeError:“ DataFrame”对象没有属性“ _get_object_id”

我希望您能为我提供帮助,我是该主题的新手。非常感谢!

2 个答案:

答案 0 :(得分:0)

首先,关于col1过滤器,您可以像这样使用isin进行过滤:

df['col1'].isin(['attribute1', 'attribute2'])

然后:

df.filter((df['col1'].isin(['atribute1', 'atribute2']))|(df['col2'].isNotNull()))

AFAIK,dataframe.column.isNotNull()应该可以工作,但是抱歉,我没有用于测试的示例数据。

答案 1 :(得分:0)

请参见以下示例:

from pyspark.sql import functions as F
df = spark.createDataFrame([(3,'a'),(5,None),(9,'a'),(1,'b'),(7,None),(3,None)], ["id", "value"])
df.show()

原始DataFrame

+---+-----+
| id|value|
+---+-----+
|  3|    a|
|  5| null|
|  9|    a|
|  1|    b|
|  7| null|
|  3| null|
+---+-----+

现在我们进行过滤:

df = df.filter( (df['id']==3)|(df['id']=='9')|(~F.isnull('value')))
df.show()

+---+-----+
| id|value|
+---+-----+
|  3|    a|
|  9|    a|
|  1|    b|
|  3| null|
+---+-----+

所以您看到

    选择
  1. row(3, 'a')row(3, null)是因为'df ['id'] == 3'
  2. 选择
  3. row(9, 'a')是因为`df ['id'] == 9'
  4. row(1, 'b')~F.isnull('value')而被选中,但未选择row(5, null)row(7, null)