【问题标题】:pyspark sql query : count distinct values with conditionspyspark sql查询:根据条件计算不同的值
【发布时间】:2019-05-29 00:29:15
【问题描述】:

我有一个如下的数据框:

+-----------+------------+-------------+-----------+
| 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 且消费量

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

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

有什么帮助吗?

谢谢!

【问题讨论】:

  • 你想要 SQL 还是 pyspark 答案?
  • 嗨 @jarlh 我想要一个 pyspark 查询,因为它的数据集很大
  • @hakim 能否请您分享可以快速用于构建数据框的示例。同时分享您正在寻找的示例输出。

标签: sql pyspark


【解决方案1】:

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

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

【讨论】:

  • 不应该是dataframe.groupBy('id_doctor').agg(F.countDistinct(F.when(col("type_drug") == "bhd" &amp; col("consumption") &lt; 16.0, col('id_patient')).otherwise(None)))吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-22
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 2018-08-07
      • 2021-08-24
      • 1970-01-01
      • 2022-09-27
      相关资源
      最近更新 更多