如何在pyspark中的多个列之间应用相同的操作

如何在pyspark中的多个列之间应用相同的操作,pyspark,Pyspark,我需要在许多列之间应用逻辑OR“|”,并在pyspark中生成一个新列。如果有许多列具有布尔值,并且需要生成一个结果列,该结果列是所有列的逻辑OR,那么最好的方法是什么。例如,如果我有一个数据帧df data = [(True,False,True), (False,False,True), (True,True,True), (False,True,False), (True,False,False)] df = sc.

我需要在许多列之间应用逻辑OR“|”,并在pyspark中生成一个新列。如果有许多列具有布尔值,并且需要生成一个结果列,该结果列是所有列的逻辑OR,那么最好的方法是什么。例如,如果我有一个数据帧df

data = [(True,False,True),
         (False,False,True),
         (True,True,True),
       (False,True,False),
       (True,False,False)]
     df = sc.parallelize(data).toDF(['ID', 'date'])

+-----+-----+-----+
|    a|    b|    c|
+-----+-----+-----+
| true|false| true|
|false|false| true|
| true| true| true|
|false| true|false|
| true|false|false|
+-----+-----+-----+
如何通过应用逻辑OR添加列“d”,如下所示

+-----+-----+-----+-----+
|    a|    b|    c|    d|
+-----+-----+-----+-----+
| true|false| true| true|
|false|false| true| true|
| true| true| true| true|
|false| true|false| true|
| true|false|false| true|
+-----+-----+-----+-----+

将布尔列作为其条件。使用PySpark时,在阅读列时考虑列表达式通常很有用

PySpark列上的逻辑操作使用位运算符:

&为及 |为了或 ~z~当然不是
将这些与比较运算符(如相结合时,可以将输入列放入列表中,并使用reduce动态构造逻辑表达式。然后将结果分配给新列

以下是实现:

>>> from functools import reduce
>>> from pyspark.sql import functions as f
>>> data
[(True, False, True), (False, False, True), (True, True, True), (False, True, False), (True, False, False)]
>>> df = sc.parallelize(data).toDF(['a', 'b', 'c'])
>>> df.show()
+-----+-----+-----+
|    a|    b|    c|
+-----+-----+-----+
| true|false| true|
|false|false| true|
| true| true| true|
|false| true|false|
| true|false|false|
+-----+-----+-----+
>>> columns = ['a', 'b', 'c']
>>> df.withColumn('and', reduce(lambda x, y: x & y, [f.col(c) for c in columns])).show()
+-----+-----+-----+-----+
|    a|    b|    c|  and|
+-----+-----+-----+-----+
| true|false| true|false|
|false|false| true|false|
| true| true| true| true|
|false| true|false|false|
| true|false|false|false|
+-----+-----+-----+-----+

>>> df.withColumn('or', reduce(lambda x, y: x | y, [f.col(c) for c in columns])).show()
+-----+-----+-----+----+
|    a|    b|    c| or|
+-----+-----+-----+----+
| true|false| true|true|
|false|false| true|true|
| true| true| true|true|
|false| true|false|true|
| true|false|false|true|
+-----+-----+-----+----+

谢谢但是我一直在寻找可以跨多个列应用操作的东西,我不必在when子句中手动输入每个列。太棒了!!!谢谢我使用了df.with column'or',reducelambda x,y:x | y,[f.colc代表df.columns中的c].show
>>> from functools import reduce
>>> from pyspark.sql import functions as f
>>> data
[(True, False, True), (False, False, True), (True, True, True), (False, True, False), (True, False, False)]
>>> df = sc.parallelize(data).toDF(['a', 'b', 'c'])
>>> df.show()
+-----+-----+-----+
|    a|    b|    c|
+-----+-----+-----+
| true|false| true|
|false|false| true|
| true| true| true|
|false| true|false|
| true|false|false|
+-----+-----+-----+
>>> columns = ['a', 'b', 'c']
>>> df.withColumn('and', reduce(lambda x, y: x & y, [f.col(c) for c in columns])).show()
+-----+-----+-----+-----+
|    a|    b|    c|  and|
+-----+-----+-----+-----+
| true|false| true|false|
|false|false| true|false|
| true| true| true| true|
|false| true|false|false|
| true|false|false|false|
+-----+-----+-----+-----+

>>> df.withColumn('or', reduce(lambda x, y: x | y, [f.col(c) for c in columns])).show()
+-----+-----+-----+----+
|    a|    b|    c| or|
+-----+-----+-----+----+
| true|false| true|true|
|false|false| true|true|
| true| true| true|true|
|false| true|false|true|
| true|false|false|true|
+-----+-----+-----+----+