Ugrás a fő tartalomhoz

Spark SQL

A dataframe-ek az SQL nyelv szintaktikáját követő utasításokon keresztül is manipulálhatók.

from pyspark.sql import  *
from pyspark.sql.functions import *

spark = SparkSession.builder.getOrCreate()

df = spark.read.option('header', True).csv('dolgozo.csv')

Ahhoz, hogy egy dataframe-et lekérdezésekben használni tudjunk, egy nézetet kell létrehozni:

df.createOrReplaceTempView('dolgozo')

A metódushívást követően a context objektum már ismeri milyen dataframe-et értünk dolgozo néven. Így már tudunk SQL lekérdezéseket végezni.

spark.sql('SELECT * FROM dolgozo').show(3)
DKODDNEVFOGLALKOZASFONOKEBELEPESFIZETESJUTALEKOAZON
7839KINGPRESIDENT000081-NOV-175000010
7698BLAKEMANAGER783981-MAY-012850030
7782CLARKMANAGER783981-JUN-092450010
információ

Fontos, hogy ezek nem tényleges SQL kérések, pusztán a szintaxis azonos.

A lekérdezések tagolásához használhatunk többsoros string-eket.

spark.sql(
'''
SELECT OAZON, COUNT(*)
FROM dolgozo
GROUP BY OAZON
'''
).show()
OAZONcount(1)
306
206
104

A programozott és az SQL megoldás általában ekvivalens.

df.groupBy(df.OAZON).agg(count('*')).sameSemantics(spark.sql('SELECT OAZON, COUNT(*) FROM dolgozo GROUP BY OAZON'))
> True

Feladatok

rdf = spark.read.option('header', True).option('inferSchema', True).csv('online_retail_data.csv')

rdf.createOrReplaceTempView('retail')

spark.sql('SELECT * FROM retail LIMIT 5').show()
InvoiceNoStockCodeDescriptionQuantityInvoiceDateUnitPriceCustomerIDCountry
53636585123AWHITE HANGING HEA...601/12/2010 8:262.5517850United Kingdom
53636571053WHITE METAL LANTERN601/12/2010 8:263.3917850United Kingdom
53636584406BCREAM CUPID HEART...801/12/2010 8:262.7517850United Kingdom
53636584029GKNITTED UNION FLA...601/12/2010 8:263.3917850United Kingdom
53636584029ERED WOOLLY HOTTIE...601/12/2010 8:263.3917850United Kingdom

Melyik országban él a legtöbb vásárló?

spark.sql(
"""
SELECT Country, COUNT(DISTINCT CustomerID) as c
FROM retail
GROUP BY Country
ORDER BY c DESC
LIMIT 1
"""
).show()
Countryc
United Kingdom3950

Adjuk meg azt az 5 országot, amelyekből a legtöbb bevétel származik!

spark.sql(
"""
SELECT Country, SUM(Quantity * UnitPrice) as p
FROM retail
GROUP BY Country
ORDER BY p DESC
LIMIT 5
"""
).show()
Countryp
United Kingdom8208343.204000185
Netherlands284661.54000000004
EIRE263276.82000000024
Germany221698.2099999999
France197463.5900000001

Melyik termék termelte a legnagyobb bevételt?

spark.sql(
"""
SELECT StockCode, Description, SUM(Quantity * UnitPrice) AS p
FROM retail
GROUP BY StockCode, Description
ORDER BY p DESC LIMIT 1
"""
).show()
StockCodeDescriptionp
DOTDOTCOM POSTAGE206245.47999999998

Melyik a legnépszerűbb termék

spark.sql(
"""
SELECT StockCode, Description, SUM(Quantity) AS c
FROM retail
GROUP BY StockCode, Description
ORDER BY c DESC LIMIT 1
"""
).show()
StockCodeDescriptionc
84077WORLD WAR 2 GLIDE...53847

Átlagosan hány különböző terméket vesz egy vásárló egy vásárlás során?

spark.sql(
"""
SELECT round(avg(c),2)
FROM (
SELECT InvoiceNo, COUNT(DISTINCT StockCode) AS c
FROM retail
GROUP BY InvoiceNo)
"""
).show()
round(avg(c), 2)
20.51

Melyik tranzakció során vásárolták a legtöbb különböző terméket és hányat?

spark.sql(
"""
SELECT InvoiceNo, COUNT(DISTINCT StockCode) AS c
FROM retail
GROUP BY InvoiceNo
ORDER BY c DESC
LIMIT 1
"""
).show()
InvoiceNoc
5735851110