Skip to content

Instantly share code, notes, and snippets.

@HiroNakamura
Created September 29, 2024 02:09
Show Gist options
  • Save HiroNakamura/65d6c8652def5e589c3e01b685235289 to your computer and use it in GitHub Desktop.
Save HiroNakamura/65d6c8652def5e589c3e01b685235289 to your computer and use it in GitHub Desktop.
Programando en BigQuery & Java
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
String strFecha = "2024-01-01"; // Ejemplo de fecha
List<Tabla> listaTabla = getDatosTabla(strFecha); // Método que obtiene datos de la tabla
if (listaTabla.size() > 0) {
// Creamos un pool de hilos para ejecutar tareas en paralelo
ExecutorService executorService = Executors.newFixedThreadPool(5); // 5 hilos
for (Tabla tabla : listaTabla) {
executorService.submit(new ProcesarTablaTask(tabla, listaTabla));
}
// Cerramos el servicio una vez que todas las tareas están en cola
executorService.shutdown();
}
}
// Esta clase representa una tarea que se ejecutará en un hilo
static class ProcesarTablaTask implements Runnable {
private Tabla tabla;
private List<Tabla> listaTabla;
public ProcesarTablaTask(Tabla tabla, List<Tabla> listaTabla) {
this.tabla = tabla;
this.listaTabla = listaTabla;
}
@Override
public void run() {
try {
Data data = new Data();
data.setFecha(tabla.getFecha());
// Aquí llamamos al método obtData en un hilo
double obtDato = obtData(data.getFecha());
Image img = null;
for (Tabla otro : listaTabla) {
img = new Image();
img.setImageNew(otro.getImage());
}
// Inserta los datos en la tabla
insertarDatosEnTabla(img, data);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// Métodos que simulan la lógica de la base de datos
public static List<Tabla> getDatosTabla(String strFecha) {
// Simula obtener datos de una tabla
return List.of(new Tabla(strFecha),new Tabla(strFecha),new Tabla(strFecha),new Tabla(strFecha),new Tabla(strFecha));
}
public static double obtData(String fecha) {
// Simula obtener un dato de la base de datos basado en la fecha
return 123.45;
}
public static void insertarDatosEnTabla(Image img, Data data) {
// Simula insertar datos en la tabla
System.out.println("Insertando datos: " + data.getFecha() + ", Imagen: " + img.getImageNew());
}
}
// Clases simuladas para representar la estructura de datos
class Tabla {
private String fecha;
private String image;
public Tabla(){}
public Tabla(String fecha) {
this.fecha = fecha;
}
public Tabla(String fecha, String image) {
this.fecha = fecha;
this.image = image;
}
public String getFecha() {
return fecha;
}
public String getImage() {
return image;
}
}
class Data {
private String fecha;
public void setFecha(String fecha) {
this.fecha = fecha;
}
public String getFecha() {
return fecha;
}
}
class Image {
private String imageNew;
public void setImageNew(String imageNew) {
this.imageNew = imageNew;
}
public String getImageNew() {
return imageNew;
}
}
CREATE OR REPLACE PROCEDURE `your_project.your_dataset.mi_stored_procedure`(input_fecha STRING)
BEGIN
-- Variable para almacenar el dato intermedio
DECLARE obt_dato FLOAT64;
-- Bucle FOR para iterar sobre los resultados de la tabla 'Tabla'
FOR record IN (
SELECT fecha
FROM `your_project.your_dataset.Tabla`
WHERE fecha = input_fecha
)
DO
-- Obtener el dato calculado de la tabla 'Data' basado en la fecha
SET obt_dato = (
SELECT AVG(valor)
FROM `your_project.your_dataset.Data`
WHERE fecha = record.fecha
);
-- Bucle FOR para iterar sobre los resultados de la tabla 'Otro'
FOR otro_record IN (
SELECT image
FROM `your_project.your_dataset.Otro`
WHERE fecha = input_fecha
)
DO
-- Insertar datos en la tabla 'Resultados'
INSERT INTO `your_project.your_dataset.Resultados` (fecha, valor_calculado, image_new)
VALUES (record.fecha, obt_dato, otro_record.image);
END FOR;
END FOR;
END;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment