pyspark 带条件的非重复值计数

siv3szwd  于 9个月前  发布在  Spark
关注(0)|答案(3)|浏览(148)

我有一个框架如下:

+-----------+------------+-------------+-----------+
| id_doctor | id_patient | consumption | type_drug |
+-----------+------------+-------------+-----------+
| d1        | p1         |        12.0 | bhd       |
| d1        | p2         |        10.0 | lsd       |
| d1        | p1         |         6.0 | bhd       |
| d1        | p1         |        14.0 | carboxyl  |
| d2        | p1         |        12.0 | bhd       |
| d2        | p1         |        13.0 | bhd       |
| d2        | p2         |        12.0 | lsd       |
| d2        | p1         |         6.0 | bhd       |
| d2        | p2         |        12.0 | bhd       |
+-----------+------------+-------------+-----------+

字符串
我想计算每位医生服用bhd的消耗量< 16.0的不同患者。
我尝试了下面的query2,但它不工作:

dataframe.groupBy(col("id_doctor")).agg(
    countDistinct(col("id_patient")).where(
        col("type_drug") == "bhd" & col("consumption") < 16.0
    )
)

rsaldnfx

rsaldnfx1#

PySpark中的另一种解决方案,无需添加另一列:

dataframe.groupBy("id_doctor").agg(
    F.countDistinct(
        F.when(
            col("type_drug") == "bhd" & col("consumption") < 16.0, col("id_patient")
        ).otherwise(None)
    )
)

字符串

5ssjco0h

5ssjco0h2#

只需在您的框架上使用where-此版本删除计数为0的id_doctor:

dataframe.where(
    col("type_drug") == "bhd" & col("consumption") < 16.0
).groupBy(
    col("id_doctor")
).agg(
    countDistinct(col("id_patient"))
)

字符串
使用这个语法,你可以保留所有的“医生”:

dataframe.withColumn(
    "fg",
    F.when(
        (col("type_drug") == "bhd") 
        & (col("consumption") < 16.0),
        col("id_patient")
    )
).groupBy(
    col("id_doctor")
).agg(
    countDistinct(col("fg"))
)

1bqhqjot

1bqhqjot3#

不添加额外列的解决方案(Scala)

dataframe
    .groupBy("id_doctor")
    .agg(
        countDistinct(when(col("type_drug")==="bhd" && col("consumption") < 16.0))
    )

字符串

相关问题