PySpark SQL Demonstration

PROBLEM STATEMENT :

a) Count the number of students whose names start with the letter “D”.
b) Display names of students, their average on the 3 exams, and a letter grade. The letter grade is computed as follows:
>= 90 is an “A”, 80 – <90 will be a “B”, and so on.
c) What is class average on exam_1?
d) Repeat (b), but the display should be sorted in descending order by average on the 3

Files to use: grades.csv and names.csv

Format of grades.csv: student_id, exam_1, exam_2, exam_3
Format of names.csv: student_id, student_name

The PySpark code is as follows:

p1 = sc.textFile(“../names.csv”)

p2 = sc.textFile(“../grades.csv”)

p1 = p1.map(lambda x: x.split(“,”))

p2 = p2.map(lambda x: x.split(“,”))

header1 = p1.first()

header2 = p2.first()

p1 = p1.filter(lambda x: x != header1)

p2 = p2.filter(lambda x: x != header2)

from pyspark.sql import Row

p1 = p1.map(lambda x: Row(id1 = x[0], name = x[1]))

p2 = p2.map(lambda x: Row(id2 = x[0], exam1 = x[1], exam2 = x[2], exam3 = x[3]))

df1 = p1.toDF()

df2 = p2.toDF()

df3 = df1.join(df2, (df1.id1 == df2.id2)).select(‘id1’, ‘name’, ‘exam1’, ‘exam2’, ‘exam3’)

df3.show()

+—+—————+—–+—–+—–+                                         

|id1|           name|exam1|exam2|exam3|

+—+—————+—–+—–+—–+

|  7|   Andy Roberts|   81|   88|   90|

| 11|Michael Holding|   65|   61|   71|

|  3|  Peter Pollock|   45|   38|   41|

|  8|  Dennis Lillee|   85|   86|   86|

|  5|    Don Bradman|   69|   65|   66|

|  6|   Ian Chappell|   90|   91|  100|

|  9|   Viv Richards|   23|   54|   32|

|  1|   Doug Walters|   76|   81|   80|

| 10|     VVS Laxman|   71|   72|   78|

|  4|   Garry Sobers|   87|   88|   82|

| 12|   Rahul Dravid|   95|   98|   91|

|  2|   Rohan Kanhai|   90|   92|   96|

+—+—————+—–+—–+—–+

from pyspark.sql import HiveContext

sqlContext = HiveContext(sc)

df3.registerTempTable(“df3temp”)

sqlContext.sql(“select * from df3temp where name like ‘D%'”).count()

                                                                             

def grade(x):

    if x >= 90:

            grade = “A”

    elif x >= 80 and x < 90:

            grade = “B”

    elif x >= 70 and x < 80:

            grade = “C”

    elif x >= 60 and x < 70:

            grade = “D”

    elif x >= 50 and x < 60:

            grade = “E”

    else:

            grade = “F”

    return grade

df4 = df3.withColumn(‘average’, (df3.exam1 + df3.exam2 + df3.exam3)/3)

df4.show()

+—+—————+—–+—–+—–+——————+                      

|id1|           name|exam1|exam2|exam3|           average|

+—+—————+—–+—–+—–+——————+

|  7|   Andy Roberts|   81|   88|   90| 86.33333333333333|

| 11|Michael Holding|   65|   61|   71| 65.66666666666667|

|  3|  Peter Pollock|   45|   38|   41|41.333333333333336|

|  8|  Dennis Lillee|   85|   86|   86| 85.66666666666667|

|  5|    Don Bradman|   69|   65|   66| 66.66666666666667|

|  6|   Ian Chappell|   90|   91|  100| 93.66666666666667|

|  9|   Viv Richards|   23|   54|   32|36.333333333333336|

|  1|   Doug Walters|   76|   81|   80|              79.0|

| 10|     VVS Laxman|   71|   72|   78| 73.66666666666667|

|  4|   Garry Sobers|   87|   88|   82| 85.66666666666667|

| 12|   Rahul Dravid|   95|   98|   91| 94.66666666666667|

|  2|   Rohan Kanhai|   90|   92|   96| 92.66666666666667|

+—+—————+—–+—–+—–+——————+

from pyspark.sql.types import *

from pyspark.sql.functions import udf

grade_udf = udf(grade, StringType())

df5 = df4.withColumn(“grade”, grade_udf(df4[‘average’]))

df5.show()

+—+—————+—–+—–+—–+——————+—–+                

|id1|           name|exam1|exam2|exam3|           average|grade|

+—+—————+—–+—–+—–+——————+—–+

|  7|   Andy Roberts|   81|   88|   90| 86.33333333333333|    B|

| 11|Michael Holding|   65|   61|   71| 65.66666666666667|    D|

|  3|  Peter Pollock|   45|   38|   41|41.333333333333336|    F|

|  8|  Dennis Lillee|   85|   86|   86| 85.66666666666667|    B|

|  5|    Don Bradman|   69|   65|   66| 66.66666666666667|    D|

|  6|   Ian Chappell|   90|   91|  100| 93.66666666666667|    A|

|  9|   Viv Richards|   23|   54|   32|36.333333333333336|    F|

|  1|   Doug Walters|   76|   81|   80|              79.0|    C|

| 10|     VVS Laxman|   71|   72|   78| 73.66666666666667|    C|

|  4|   Garry Sobers|   87|   88|   82| 85.66666666666667|    B|

| 12|   Rahul Dravid|   95|   98|   91| 94.66666666666667|    A|

|  2|   Rohan Kanhai|   90|   92|   96| 92.66666666666667|    A|

+—+—————+—–+—–+—–+——————+—–+

sqlContext.sql(“select avg(exam1) from df3temp”).collect()

[Row(avg(CAST(exam1 AS DOUBLE))=73.08333333333333)]

df5.registerTempTable(“df5temp”)

sqlContext.sql(“select * from df5temp order by average desc”).show()

+—+—————+—–+—–+—–+——————+—–+                

|id1|           name|exam1|exam2|exam3|           average|grade|

+—+—————+—–+—–+—–+——————+—–+

| 12|   Rahul Dravid|   95|   98|   91| 94.66666666666667|    A|

|  6|   Ian Chappell|   90|   91|  100| 93.66666666666667|    A|

|  2|   Rohan Kanhai|   90|   92|   96| 92.66666666666667|    A|

|  7|   Andy Roberts|   81|   88|   90| 86.33333333333333|    B|

|  4|   Garry Sobers|   87|   88|   82| 85.66666666666667|    B|

|  8|  Dennis Lillee|   85|   86|   86| 85.66666666666667|    B|

|  1|   Doug Walters|   76|   81|   80|              79.0|    C|

| 10|     VVS Laxman|   71|   72|   78| 73.66666666666667|    C|

|  5|    Don Bradman|   69|   65|   66| 66.66666666666667|    D|

| 11|Michael Holding|   65|   61|   71| 65.66666666666667|    D|

|  3|  Peter Pollock|   45|   38|   41|41.333333333333336|    F|

|  9|   Viv Richards|   23|   54|   32|36.333333333333336|    F|

+—+—————+—–+—–+—–+——————+—–+

Advertisements

One thought on “PySpark SQL Demonstration

  1. Pingback: Logistic Regression Model in PySpark – Iris Dataset – Data Central – With Harini Kannan

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s