Pyspark Dense_rank Window Function

Pyspark Dense_rank Window Function
DENSE_RANK () i Pyspark er en vindusfunksjon som setter rekkene til radene i hver partisjon.

Rangeringen starter fra 1, og hvis noen verdier er de samme i to eller flere rader, vil samme rang bli tildelt.

Her er verdiene fra kolonnen der vi spesifiserte kolonnen i Orderby (). Så basert på verdiene i denne kolonnen, sjekker Dense_rank () verdiene og tildeler rangeringsnummeret.

Det viktigste er at DENSE_RANK () ikke er tilgjengelig direkte. Vi må importere det fra Pyspark.SQL.funksjoner modul.

I Pyspark er det mulig å dele opp radene i DataFrame ved å bruke vindusfunksjonen. Det er tilgjengelig i Pyspark.SQL.vindu modul.

Fordelen med partisjon er å oppnå datakonsistens og gruppering. Etter å ha utført partisjonen, kan vi sette rekkene til radene i hver partisjon ved hjelp av Dense_rank () -funksjonen.

Det er mulig å skille ut radene i en dataaframe basert på verdiene i en bestemt kolonne. Så alle lignende verdier er satt til hver partisjon.

Vi må følge følgende trinn for å partisjonere og bruke DENSE_RANK på partisjonerte data:

Trinn:

  1. Lag en Pyspark DataFrame med lignende verdier i minst en kolonne.
  2. Partisjon Dataene ved hjelp av PartitionBy () -metoden tilgjengelig i vindusfunksjonen og bestill dem basert på kolonnen ved å bruke OrderBy () -funksjonen.
    Syntaks:
    partisjon = vindu.Partitionby (“kolonne”).Orderby (“Kolonne”)
    Vi kan bestille de partisjonerte dataene med den partisjonerte kolonnen eller en hvilken som helst annen kolonne.
  3. Nå kan du bruke DENSE_RANK () -funksjonen på de partisjonerte radene ved å bruke over () -funksjonen.
    Så vi vil legge til en kolonne for å lagre radnummeret ved å bruke Column () -funksjonen.
    Syntaks:
    DataFrame_obj.WithColumn (“Navn”, Dense_rank ().over (partisjon))
    Her spesifiserer navnet radnavn, og DataFrame_OBJ er vår Pyspark DataFrame.

    La oss implementere koden.

Eksempel 1
Her vil vi lage en Pyspark DataFrame som har 5 kolonner: ['Subject_id', 'Name', 'Age', 'Technology1', 'Technology2'] med 10 rader og partisjon radene basert på Teknologi1 Bruke vindusfunksjonen.

Til slutt vil vi gi rekker til radene i alle partisjoner ved å legge til en ny kolonne som heter “Tett rang”.

Importer pyspark
Fra Pyspark.SQL import *
Spark_app = SparkSession.bygger.AppName ('_').getorCreate ()
Studenter = [(4, 'Sravan', 23, 'PHP', 'Testing'),
(4, 'Sravan', 23, 'PHP', 'Testing'),
(46, 'Mounika', 22, '.Nett ',' html '),
(4, 'Deepika', 21, 'Oracle', 'html'),
(46, 'Mounika', 22, 'Oracle', 'Testing'),
(12, 'Chandrika', 22, 'Hadoop', 'C#'),
(12, 'Chandrika', 22, 'Oracle', 'Testing'),
(4, 'Sravan', 23, 'Oracle', 'C#'),
(4, 'Deepika', 21, 'PHP', 'C#'),
(46, 'Mounika', 22, '.Nett ',' testing ')
]
DataFrame_OBJ = Spark_App.CreateTataFrame (Studenter, ['Subject_id', 'Name', 'Age', 'Technology1', 'Technology2'])
Print ("---------- Faktisk DataFrame ----------")
DataFrame_obj.forestilling()
# Importer vindusfunksjonen
Fra Pyspark.SQL.Vindusimportvindu
#import the Dense_rank fra Pyspark.SQL.funksjoner
Fra Pyspark.SQL.Funksjoner importerer DENSE_RANK
#Partition DataFrame basert på verdiene i Technology1 -kolonnen og
#Order radene i hver partisjon basert på emne_id -kolonnen
partisjon = vindu.Partitionby ("Technology1").Orderby ('emne_id')
Print ("---------- Partitioned DataFrame ----------")
#Now omtale DENSE_RANK for hver rad i tett rangeringskolonne
DataFrame_obj.WithColumn ("Tett rangering", DENSE_RANK ().over (partisjon)).forestilling()

Produksjon:

Forklaring
Den første utgangen representerer de faktiske dataene som er til stede i DataFrame.

I den andre utgangen gjøres partisjonen basert på Teknologi1 kolonne.

Totalt partisjoner: - 4

Partisjon 1:
.Net skjedde to ganger i den første partisjonen. Verdiene i emn_id -kolonnen er de samme. Derfor returnerer den tette_rank () -funksjonen samme rangering-1 for begge .Netto verdier.

Partisjon 2:
Hadoop skjedde en gang i den andre partisjonen. Så rangeringen er 1.

Partisjon 3:
Oracle skjedde fire ganger i tredje partisjon.
For de to første orakelene er emne_idverdiene de samme, så for begge er rang-1 tildelt.
For det tredje orakelet er rangering 2.
For det siste Oracle er rangering 3.

Partisjon 4:
PHP forekom tre ganger i fjerde partisjon, og verdiene i emnet_id -kolonnen er de samme for alle. Derfor er rangering 1 for alle PHP.

Eksempel 2
Her, ved å bruke vindusfunksjonen, vil vi partisjonere radene basert på Technology2.

Til slutt vil vi rangere radene basert på emne_id -kolonnen i alle partisjoner ved å legge til en ny kolonne som heter “Tett rang”.

(Hvis du ikke opprettet Pyspark DataFrame, oppretter du det ved å bruke det første eksemplet.)

# Importer vindusfunksjonen
Fra Pyspark.SQL.Vindusimportvindu
#import the Dense_rank fra Pyspark.SQL.funksjoner
Fra Pyspark.SQL.Funksjoner importerer DENSE_RANK
#Partition DataFrame basert på verdiene i Technology2 -kolonnen og
#Order radene i hver partisjon basert på emne_id -kolonnen
partisjon = vindu.Partitionby ("Technology2").Orderby ('emne_id')
Print ("---------- Partitioned DataFrame ----------")
#Now omtale DENSE_RANK for hver rad i tett rangeringskolonne
DataFrame_obj.WithColumn ("Tett rangering", DENSE_RANK ().over (partisjon)).forestilling()

Produksjon:

Forklaring
Utgangen representerer de faktiske dataene som er til stede i DataFrame.

I den andre utgangen gjøres partisjonen basert på Technology2 Kolonne og bestilt basert på emnet_id -kolonnen.

Totalt partisjoner: - 3

Partisjon 1:
C# oppstod tre ganger i første partisjon. Også de to første verdiene i emn_id -kolonnen er de samme. Derfor returnerer den tette_rank () -funksjonen samme rangering-1 for de to første C#, og for den tredje C#er rangering 2.

Partisjon 2:
HTML skjedde to ganger i den andre partisjonen, og emnet_idverdiene er forskjellige for disse to. Så rang-1 tildeles for den første HTML, og Rank-2 er tildelt for den andre.

Partisjon 3:
Testing skjedde fem ganger i tredje partisjon.
For de to første testene er emnet_idverdiene de samme, så for begge er rang-1 tildelt.
For den tredje testingen er rangering 2.
For den siste testingen var rangering 3.

Eksempel 3
Her, ved å bruke vindusfunksjonen, vil vi partisjonere radene basert på Technology2.

Til slutt vil vi rangere radene basert på alderssøylen i alle partisjoner ved å legge til en ny kolonne som heter “Tett rang”.

(Hvis du ikke opprettet Pyspark DataFrame, oppretter du det ved å bruke det første eksemplet.)

# Importer vindusfunksjonen
Fra Pyspark.SQL.Vindusimportvindu
#import the Dense_rank fra Pyspark.SQL.funksjoner
Fra Pyspark.SQL.Funksjoner importerer DENSE_RANK
#Partition DataFrame basert på verdiene i Technology2 -kolonnen og
#Order radene i hver partisjon basert på alderskolonnen
partisjon = vindu.Partitionby ("Technology2").Orderby ('Alder')
Print ("---------- Partitioned DataFrame ----------")
#Now omtale DENSE_RANK for hver rad i tett rangeringskolonne
DataFrame_obj.WithColumn ("Tett rangering", DENSE_RANK ().over (partisjon)).forestilling()

Produksjon:

Forklaring
Utgang representerer de faktiske dataene som er til stede i DataFrame.
I den andre utgangen gjøres partisjonen basert på Technology2 -kolonnen og bestilt basert på alderskolonnen.

Totalt partisjoner: - 3

Partisjon 1:
C# oppstod tre ganger i første partisjon. Alle verdiene i alderssøylen er forskjellige. Derfor returnerer den tette_rank () -funksjonen rekkene 1,2 og 3 for tre C# -verdier.

Partisjon 2:
HTML skjedde to ganger i første partisjon. Alle verdiene i alderssøylen er forskjellige. Derfor returnerer Dense_rank () -funksjonen rekkene 1 og 2 for to HTML -verdier.

Partisjon 3:
Testing skjedde fem ganger i tredje partisjon.
For de tre første testverdiene er aldersverdiene de samme. Så for tre tildeles rang-1.
Aldersverdiene for fjerde og femte testing er de samme, så rang-2 er gitt til begge.

Konklusjon

Vi diskuterte partisjonering av radene i PySpark DataFrame og satte rangering i hver partisjon ved hjelp av DENSE_RANK () vindusfunksjonen. DENSE_RANK i Pyspark er en vindusfunksjon som setter rekkene til radene i hver partisjon. Rangeringen starter fra 1, og hvis noen verdier er de samme i to eller flere rader, vil samme rang bli tildelt.