Pyspark:计数每行True值的数量

7jmck4yq  于 2023-04-05  发布在  Spark
关注(0)|答案(2)|浏览(177)

在databricks中工作,我有一个dataframe,看起来像这样:

columns = ["a", "b", "c"]
data = [(True, True, True), (True, True, True), (True, False, True)]
df = spark.createDataFrame(data).toDF(*columns)
df.display()

我想创建一个新的列“number_true_values”,它包含每行True值的数量。不幸的是,在pyspark中似乎不能像pandas那样只对True和False值求和。代码

import pyspark.sql.functions as F
df.withColumn('number_true_values', sum([F.col(column) for column in df.columns]))

抛出异常AnalysisException: [DATATYPE_MISMATCH.BINARY_OP_DIFF_TYPES] Cannot resolve "(a + 0)" due to data type mismatch: the left and right operands of the binary operator have incompatible types ("BOOLEAN" and "INT").;
如果我有一个包含数字的 Dataframe ,而不是像下面这样...

columns = ["a", "b", "c"]
data = [(1, 0, 1), (1, 0, 0), (1, 1, 1)]
df = spark.createDataFrame(data).toDF(*columns)
df.display()

...上面的语法将工作并返回所需的结果:

如何计算数据块中每行True值的数量?

isr3a4wc

isr3a4wc1#

你可以将列转换为long,然后求和,就像这样,

import pyspark.sql.functions as F

df.withColumn('number_true_values', sum([F.col(column).cast("long") for column in df.columns])).show()

输出:

+----+-----+----+------------------+
|   a|    b|   c|number_true_values|
+----+-----+----+------------------+
|true| true|true|                 3|
|true| true|true|                 3|
|true|false|true|                 2|
+----+-----+----+------------------+
h7appiyu

h7appiyu2#

虽然最简单的方法已经提到,你也可以创建一个数组,并根据要计数的值过滤数组。它可以用于任何值,而不仅仅是T/F。
下面是一个示例

data_sdf. \
    withColumn('num_true', 
               func.size(func.filter(func.array('a', 'b', 'c'), lambda x: x == func.lit(True)))
               ). \
    show()

# +----+-----+----+--------+
# |   a|    b|   c|num_true|
# +----+-----+----+--------+
# |true| true|true|       3|
# |true| true|true|       3|
# |true|false|true|       2|
# +----+-----+----+--------+

相关问题