2
votes

requête SQL pyspark: compter les valeurs distinctes avec des conditions

J'ai un dataframe comme ci-dessous:

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

Je veux compter des patients distincts qui prennent Bhd avec une consommation

J'ai essayé la requête suivante mais cela ne fonctionne pas:

+-----------+------------+-------------+-----------+
| 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       |
+-----------+------------+-------------+-----------+

une aide?

merci!


3 commentaires

Voulez-vous une réponse SQL ou pyspark?


salut @jarlh je veux une requête pyspark car c'est un grand ensemble de données


@hakim Pourriez-vous s'il vous plaît partager l'exemple qui peut être rapidement utilisé pour construire la base de données. Partagez également l'exemple de sortie que vous recherchez.


3 Réponses :


1
votes

Utilisez simplement le where sur votre dataframe - cette version supprime le id_doctor où le compte est 0:

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

En utilisant cette syntaxe, vous pouvez conserver tous les " médecins ":

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


0 commentaires

2
votes

Et solution sans ajouter de colonne supplémentaire (Scala)

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


0 commentaires

5
votes

Une autre solution dans PySpark sans ajouter une autre colonne:

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


0 commentaires