[Python] Hilo general

R

sigo con mis peleas. Estoy intentando conectarme a mi propia base de datos desde pyspark, si lo hago desde window lo ago sin problemas pero si lo hago desde wsl no puedo, me sale que no esta el driver cuando se lo estoy pasando a la hopra de iniciar la sesion.
Si conecto a la base de datos desde wsl directamente sin pasar por pyspark si puedo conectar,
alguien ha hecho algo aprecio? llevo toa la mañana con esto y he probado ya todo lo posible descargandome 0349853 conectores distintos

1 respuesta
Dr_Manhattan

#1861 A ver, no sé qué es lo que estás intentando ni de qué forma ya que no lo indicas, pero por hablar de uno de los problemas más comunes:

las librerías se instalan cuando se arranca el cluster, por mucho que le pases el driver cuando haces el spark.read.jdbc si el jar de postgres por ejemplo no está instalado no te va a funcionar. Tendrás que tener la librería disponible para cuando arranque la sesión de spark, por ejemplo usando spark.jars.packages

1 respuesta
R

#1862 no estoy probando en el cluster solo en wsl.
Me he bajado el conector y al cargar la sesión de pyspark le pongo spark.jars y le indico donde está el conector.

Luego al leer el csv en opciones le indico el driver com.mysql.jc o algo así pero no hay manera. Creo que no me falta ninguna librería

1 respuesta
Dr_Manhattan

#1863 pero para leer un csv no necesitas ningún conector, simplemente haces spark.read.csv + las opciones del header etc la librería estándar ya trae el csv

1 respuesta
R

#1864 perdon, quiero decir leer la base de datos

spark = SparkSession.builder \
    .appName("test") \
    .config("spark.driver.extraClassPath", "mysql-connector-j-8.4.0.jar") \
    .getOrCreate()
df = spark.read.format("jdbc").option("url","jdbc:mysql://ip:port/test").option("driver","com.mysql.jdbc.Driver").option("dbtable",'tabla_1').option("user",'user').option("password",'pass').load()
df.show()

en window me funciona pero en ubuntu no, alguna libreria me tiene que faltar porque no hay manera pero no lo veo

3 respuestas
Kaiserlau

#1865 te debe de estar sacando algun código de error la sesión al no conseguir la conexión. Estaría bien que lo miraras a ver si te da alguna pista.

1 respuesta
Dr_Manhattan

#1865 yo creo que el problema es la ruta del conector, mira la ruta absoluta, y asegúrate de que el jar está en esa ruta mediante la terminal de ubuntu

1 1 respuesta
R

#1866 el error que me escupe es que no me encuentra el conector

spoiler

#1867 como se hace eso? perdon por el retraso

1 respuesta
Slowbro

#1868 Creo que se refiere a esto,

...
.config("spark.driver.extraClassPath", "/ruta/en/wsl/al/archivo/mysql-connector-j-8.4.0.jar") 
...

Si no lo tienes en /home/refresco, prueba en lo que tengas montado en /mnt y su ubicacion en Windows.

1 respuesta
R

#1869 nada, sigue tirando como si no lo encontrara

W

#1865 Pon spark.jars:

spark = SparkSession.builder \
    .appName("test") \
    .config("spark.jars", "mysql-connector-j-8.4.0.jar") \
    .getOrCreate()

Y prueba ejecutando este comando:

spark-submit --jars mysql-connector-j-8.4.0.jar archivo_pyspark.py
R

bueno anoche de madruga consegui arreglarlo. Parece que era un problemas de versiones que no encontraba el connector por mas que se lo pasara.

Tenia una version de pyspark en la carpeta de spark y otra como libreria de python, lo que hice fue borrar la de la libreria de python y borrar todo spark.

Volver a instalar spark y comprobar que tenia solo una version de pyspark en el ordenador y era la de spark

whereis pyspark

. Finalmente meter el conector en la carpeta jar de spark y listo.

curl -O https://archive.apache.org/dist/spark/spark-3.5.1/spark-3.5.1-bin-hadoop3.tgz
sudo tar xvf spark-3.5.1-bin-hadoop3.tgz
sudo mkdir /opt/spark
sudo mv spark-3.5.1-bin-hadoop3/* /opt/spark
sudo chmod -R 777 /opt/spark
sudo apt-get install openjdk-8-jdk -y

Una vez meter este connector(https://dev.mysql.com/downloads/connector/j/5.1.html) mysql-connector-j-8.4.0.jar en la carpeta /opt/spark/jar/.

import pyspark
from pyspark.sql import SparkSession
print(pyspark.__version__)
spark = SparkSession.builder \
    .appName("PySpark MySQL Connection").getOrCreate()

df = spark.read.format("jdbc").option("url","jdbc:mysql://ip:port/nombre_base_datos").option("driver","com.mysql.cj.jdbc.Driver").option("dbtable",'tabla').option("user",'usuario').option("password",'pass').load()

Y asi os deberia ir si alguien tiene un problema parecio, si no pues mala suerte :(

1 respuesta
Dr_Manhattan

#1872 te juro que estuve a punto de comentarte lo de las versiones xddd me alegro de que lo hayas solucionado

1 respuesta
R

#1873 bueno asi no se me olvida, la proxma vez sedra lo primero que mire xd

2
29 días después
R

Una pregunta muy estupida epro que no se si existe esa opcion en windows o hayq ue ahacer una funcion.
En linux si quiero leer juntos todos los csvs de una carpeta y metertlos en un dataframe pongo "*.csv", existe algo igual en windows o tengo que ir abriendo y concatenando con una funcion?

2 respuestas
ercabesa

#1875 si lo haces desde Python es exactamente igual que Linux

hda

#1875

from glob import glob
import pandas as pd

files = glob(r"ruta/donde/están/*.csv")
df = pd.concat([pd.read_csv(file) for file in files])

Esto es lo más sencillo y eficiente (sin paralelizar la carga) que conozco para hacer lo que dices, en cuatro líneas. Lo uso bastante.

Si son cientos de miles/millones de archivos sí que lo paralelizo con from multiprocessing import Pool

1 respuesta
R

#1877 así lo he hecho con glob, pero en Linux puedo hacer
Pd.read_csv('*.csv') directamente y me hace eso.

1 respuesta
hda

#1878 no fastidies que puedes usar wildcards en la función read_csv directamente :O

Voy a la documentación.

Edit: Aquí tiran de dask y luego pasan el dask a pandas. Igual es eficiente con grandes volúmenes.

1 respuesta
R

#1879 tampoco tengo tantos csv y no son tan grandes para tenerme que preocupar por la memoriam pero me tenía loco eso de poder usar * en Linux y Windows no xd

1 respuesta
hda

#1880 ya, también me he quedado loco yo. En la documentación no he visto nada.

2 meses después
hda

Hoy he empezado a usar uv, ¿alguien más? El cambio es sustancial para mí, porque llevo usando conda, anaconda y ahora miniconda, desde hace más de un lustro. Vaya, que suelo usar conda para todo, y muy poco de vez en cuando pip.

Creo que el cambio a uv es para mejor, la verdad.

https://docs.astral.sh/uv/

7 1 respuesta
Dr_Manhattan

#1882 Pues no lo conocía, tiene muy buena pinta, voy a darle un try. Gracias!

1