pyspark sql查询:根据条件计算不同的值

时间:2019-01-02 10:48:52

标签: sql pyspark

我有一个如下数据框:

+-----------+------------+-------------+-----------+
| 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的不同患者。

我尝试了以下查询,但不起作用:

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

有什么帮助吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

return payload

答案 1 :(得分:1)

解决方案,而无需添加其他列(Scala)

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

答案 2 :(得分:0)

只需在数据帧上使用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"))
)