我想创建一个新列,其中包含取决于过滤器的数据帧计数。
这里是一个例子:
+---------------------------------------+
|conditions |
+---------------------------------------+
|* |
|* |
|p1==1 AND p2==1 |
我尝试过:
df = df.withColumn('cardinal',df.filter(conditions).count())
它没有用。错误消息是:
“字符串类型的过滤器表达式'conditions'不是布尔值。; \ n过滤条件#2043:字符串\ n +-
答案 0 :(得分:2)
literal
功能必须使用 df.filter
。
尝试以下语法:
>>> df1 = df.withColumn('cardinal',lit(df.filter(conditions).count()))
现在 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 |
+---+---+--------+
(或)
不使用conditions
变量
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 |
+---+---+--------+