使用过滤器创建一个新列

时间:2018-11-22 15:25:30

标签: apache-spark pyspark apache-spark-sql

我想创建一个新列,其中包含取决于过滤器的数据帧计数。

这里是一个例子:

+---------------------------------------+
|conditions                             |
+---------------------------------------+
|*                                      |
|*                                      |
|p1==1 AND p2==1                        |

我尝试过:

df = df.withColumn('cardinal',df.filter(conditions).count())

它没有用。错误消息是:

  

“字符串类型的过滤器表达式'conditions'不是布尔值。; \ n过滤条件#2043:字符串\ n +-

1 个答案:

答案 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       |
+---+---+--------+