Apache spark 使用筛选器创建新列

Apache spark 使用筛选器创建新列,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我想创建一个新列,该列包含dataframe的计数,具体取决于筛选器 以下是一个例子: +---------------------------------------+ |conditions | +---------------------------------------+ |* | |*

我想创建一个新列,该列包含dataframe的计数,具体取决于筛选器

以下是一个例子:

+---------------------------------------+
|conditions                             |
+---------------------------------------+
|*                                      |
|*                                      |
|p1==1 AND p2==1                        |
我试过:

df=df.withColumn('cardinal',df.filter(conditions.count())
它不起作用。错误消息是:

字符串类型的筛选器表达式“条件”不是布尔值;\n筛选器条件#2043:字符串\n+-


对于
df.filter
函数,必须使用
文字

尝试以下语法:

现在,df1数据帧将添加
cardinal

更新:

我举了一个简单的例子:

import pyspark.sql.functions as F
df=sc.parallelize([(1,1),(2,1),(3,2)]).toDF(["p1","p2"]) #createDataFrame
conditions=((F.col('p1')==1) & (F.col('p2')==1)) #define conditions variable
df1=df.withColumn("cardinal",F.lit(df.filter(conditions).count())) #add column
df1.show(10,False)
+---+---+--------+
|p1 |p2 |cardinal|
+---+---+--------+
|1  |1  |1       |
|2  |1  |1       |
|3  |2  |1       |
+---+---+--------+
(或)

不使用
条件
变量

df1=df.withColumn("cardinal",F.lit(df.filter((F.col('p1')==1) & (F.col('p2')==1)).count()))
df1.show(10,False)
+---+---+--------+
|p1 |p2 |cardinal|
+---+---+--------+
|1  |1  |1       |
|2  |1  |1       |
|3  |2  |1       |
+---+---+--------+
(或)

使用
.where
子句

df1=df.withColumn("cardinal",F.lit(df.where((F.col("p1")==1) & (F.col("p2")==1)).count()))
df1.show(10,False)
+---+---+--------+
|p1 |p2 |cardinal|
+---+---+--------+
|1  |1  |1       |
|2  |1  |1       |
|3  |2  |1       |
+---+---+--------+

我尝试了一下,得到了一个错误消息:“string类型的过滤器表达式‘conditions’不是布尔值\nFilter conditions#2043:string\n+-–@zineb.el,在您的筛选器表达式中,通过从pyspark.sql.fucantions import*
导入
,确保使用了
,有关类似问题,请参阅此链接。。是的,我做了:df1=df.withColumn('cardinal2',F.lit(df.filter(F.col('conditions')).count())@zineb.el,我已经用我尝试过的简单例子更新了我的
答案
,如果你仍然面临这个问题,请
用你的代码和样本数据更新你的问题
,这样我们就可以尝试在我们这边重新创建这个问题。
df1=df.withColumn("cardinal",F.lit(df.where((F.col("p1")==1) & (F.col("p2")==1)).count()))
df1.show(10,False)
+---+---+--------+
|p1 |p2 |cardinal|
+---+---+--------+
|1  |1  |1       |
|2  |1  |1       |
|3  |2  |1       |
+---+---+--------+