En este proyecto, vamos a aplicar todo lo aprendido en Apache Spark para realizar un análisis de datos de sensores. Los datos provendrán de un archivo CSV que contiene lecturas de varios sensores. Realizaremos las siguientes tareas:
Lectura y Preprocesamiento de Datos:
Análisis Descriptivo:
Aplicación de Machine Learning:
Evaluación del Modelo:
Despliegue en un Clúster:
import org.apache.spark.sql.{SparkSession, DataFrame}
import org.apache.spark.sql.functions._
import org.apache.spark.ml.{Pipeline, PipelineModel}
import org.apache.spark.ml.feature.{VectorAssembler, StandardScaler}
import org.apache.spark.ml.regression.LinearRegression
import org.apache.spark.ml.evaluation.RegressionEvaluator
object SensorDataAnalysis {
def main(args: Array[String]): Unit = {
// Crear una SparkSession
val spark = SparkSession.builder
.appName("Sensor Data Analysis")
.master("local[*]") // Cambiar a "yarn" o "spark://:7077" para clúster
.getOrCreate()
// Leer datos desde un archivo CSV
val data = spark.read.option("header", "true").option("inferSchema", "true").csv("path/to/sensor_data.csv")
// Mostrar el esquema de los datos
data.printSchema()
// Realizar algunas transformaciones básicas
val dataCleaned = data.na.drop() // Eliminar filas con valores nulos
// Calcular estadísticas descriptivas básicas
dataCleaned.describe().show()
// Seleccionar columnas relevantes y crear características
val assembler = new VectorAssembler()
.setInputCols(Array("sensor1", "sensor2", "sensor3"))
.setOutputCol("features")
val dataTransformed = assembler.transform(dataCleaned)
// Dividir los datos en conjuntos de entrenamiento y prueba
val Array(trainingData, testData) = dataTransformed.randomSplit(Array(0.8, 0.2))
// Definir el modelo de regresión lineal
val lr = new LinearRegression()
.setLabelCol("target")
.setFeaturesCol("features")
// Crear el pipeline
val pipeline = new Pipeline().setStages(Array(assembler, lr))
// Ajustar el modelo con los datos de entrenamiento
val model = pipeline.fit(trainingData)
// Realizar predicciones en los datos de prueba
val predictions = model.transform(testData)
// Evaluar el modelo
val evaluator = new RegressionEvaluator()
.setLabelCol("target")
.setPredictionCol("prediction")
.setMetricName("rmse")
val rmse = evaluator.evaluate(predictions)
println(s"Root Mean Squared Error (RMSE) on test data = $rmse")
// Guardar el modelo entrenado
model.write.overwrite().save("path/to/save/model")
// Finalizar SparkSession
spark.stop()
}
}
Crear una SparkSession:
Leer datos desde un archivo CSV:
Mostrar el esquema de los datos:
Realizar algunas transformaciones básicas:
Calcular estadísticas descriptivas básicas:
Seleccionar columnas relevantes y crear características:
VectorAssembler
para combinar múltiples columnas de características en una única columna de características (features
).Dividir los datos en conjuntos de entrenamiento y prueba:
Definir el modelo de regresión lineal:
target
) usando las características.Crear el pipeline:
Ajustar el modelo con los datos de entrenamiento:
Realizar predicciones en los datos de prueba:
Evaluar el modelo:
Guardar el modelo entrenado:
Finalizar SparkSession:
Este proyecto proporciona una práctica integral de los conceptos básicos de Apache Spark, incluyendo la lectura y preprocesamiento de datos, el análisis descriptivo, la construcción y evaluación de un modelo de machine learning, y la configuración para el despliegue en un clúster.