En aquest tema, aprendrem a realitzar operacions bàsiques i avançades amb DataFrames en Apache Spark. Els DataFrames són una abstracció de dades distribuïdes que permeten treballar amb dades estructurades de manera eficient. A més, proporcionen una API de més alt nivell que els RDDs, facilitant la manipulació i l'anàlisi de dades.

Continguts

Creació de DataFrames

Des d'un fitxer CSV

from pyspark.sql import SparkSession

# Crear una sessió de Spark
spark = SparkSession.builder.appName("DataFrameOperations").getOrCreate()

# Carregar un fitxer CSV en un DataFrame
df = spark.read.csv("path/to/file.csv", header=True, inferSchema=True)
df.show()

Des d'un RDD

# Crear un RDD
rdd = spark.sparkContext.parallelize([
    (1, "Alice", 29),
    (2, "Bob", 31),
    (3, "Cathy", 25)
])

# Definir l'esquema
from pyspark.sql.types import StructType, StructField, IntegerType, StringType

schema = StructType([
    StructField("id", IntegerType(), True),
    StructField("name", StringType(), True),
    StructField("age", IntegerType(), True)
])

# Convertir l'RDD en un DataFrame
df = spark.createDataFrame(rdd, schema)
df.show()

Selecció de Columnes

Seleccionar una o més columnes

# Seleccionar una columna
df.select("name").show()

# Seleccionar múltiples columnes
df.select("name", "age").show()

Afegir una nova columna

# Afegir una nova columna amb una operació aritmètica
df = df.withColumn("age_plus_one", df["age"] + 1)
df.show()

Filtratge de Files

Filtrar files amb una condició

# Filtrar files on l'edat és major de 30
df.filter(df["age"] > 30).show()

Filtrar files amb múltiples condicions

# Filtrar files on l'edat és major de 25 i el nom és "Alice"
df.filter((df["age"] > 25) & (df["name"] == "Alice")).show()

Agregacions

Funcions d'agregació bàsiques

# Calcular l'edat mitjana
df.agg({"age": "avg"}).show()

# Calcular l'edat màxima
df.agg({"age": "max"}).show()

Agrupar i agregar

# Agrupar per una columna i calcular l'edat mitjana
df.groupBy("name").agg({"age": "avg"}).show()

Unions i Joins

Unir dos DataFrames

# Crear un segon DataFrame
df2 = spark.createDataFrame([
    (1, "USA"),
    (2, "UK"),
    (3, "Canada")
], ["id", "country"])

# Unir els DataFrames per la columna "id"
df.join(df2, "id").show()

Operacions de Grup

Agrupar per una columna i aplicar funcions d'agregació

# Agrupar per la columna "country" i calcular l'edat mitjana
df.join(df2, "id").groupBy("country").agg({"age": "avg"}).show()

Exercicis Pràctics

Exercici 1: Creació i Selecció

  1. Crea un DataFrame a partir d'un fitxer CSV.
  2. Selecciona les columnes "name" i "age".

Solució

# Crear un DataFrame a partir d'un fitxer CSV
df = spark.read.csv("path/to/file.csv", header=True, inferSchema=True)

# Seleccionar les columnes "name" i "age"
df.select("name", "age").show()

Exercici 2: Filtratge i Agregació

  1. Filtra les files on l'edat és major de 25.
  2. Calcula l'edat màxima de les files filtrades.

Solució

# Filtrar les files on l'edat és major de 25
filtered_df = df.filter(df["age"] > 25)

# Calcular l'edat màxima de les files filtrades
filtered_df.agg({"age": "max"}).show()

Exercici 3: Unions i Agrupacions

  1. Crea un segon DataFrame amb les columnes "id" i "country".
  2. Uneix els dos DataFrames per la columna "id".
  3. Agrupa per la columna "country" i calcula l'edat mitjana.

Solució

# Crear un segon DataFrame
df2 = spark.createDataFrame([
    (1, "USA"),
    (2, "UK"),
    (3, "Canada")
], ["id", "country"])

# Unir els DataFrames per la columna "id"
joined_df = df.join(df2, "id")

# Agrupar per la columna "country" i calcular l'edat mitjana
joined_df.groupBy("country").agg({"age": "avg"}).show()

Conclusió

En aquesta secció, hem après a crear DataFrames, seleccionar columnes, filtrar files, realitzar agregacions, unir DataFrames i aplicar operacions de grup. Aquestes operacions són fonamentals per treballar amb dades estructurades en Apache Spark i proporcionen una base sòlida per a tasques més avançades de processament de dades. En el següent mòdul, explorarem com treballar amb Datasets en Spark.

© Copyright 2024. Tots els drets reservats