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
#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
#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
#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
#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
#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.
#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
#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.
#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
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
#1872 te juro que estuve a punto de comentarte lo de las versiones xddd me alegro de que lo hayas solucionado
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?
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
#1877 así lo he hecho con glob, pero en Linux puedo hacer
Pd.read_csv('*.csv') directamente y me hace eso.
#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