[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/

8 2 respuestas
Dr_Manhattan

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

1
1 mes después
hitsvil

Hola,

Trabajo en una empresa humilde y sinceramente no podemos permitirnos pagar lo que nos pide un developer ahora mismo.
Así que por mi cuenta, en casa, estoy intentando hacer algo que creo que debe ser sencillo para alguien que sepa, yo no tengo ni idea.

Podría preguntarlo por Reddit, de donde he sacado bastante info, pero teniendo MV quizá alguien me puede ayudar. Estoy dispuesto a pagar algo, pero es que me están pidiendo 2k por un trabajo que no sé si los vale.

Si creéis que lo que pido vale esos 2k decídmelo, soy totalmente ajeno al mundillo y no quiero aprovecharme de nadie.

Dicho esto:

Lo que necesito es ir a 12 links, buscar una información y copiarla en un excel. He conseguido que al ejecutar el .py se abra Chrome, vaya a uno de los links, haga scroll down como un humano e incluso que se cree el archivo excel, pero el campo que necesito aparece vacío. De hecho en Python me dice que no ha sido capaz de encontrar la info (y yo veo como haciendo scroll pasa por esa info en concreto).

Por ser más específico, necesito que abra este link, por ejemplo: https://www.amazon.es/dp/B07BKQLZNB
Haga scroll para abajo, y encuentre esta info:

Clasificación en los más vendidos de Amazon: nº207.615 en Moda (Ver el Top 100 en Moda)
nº246 en Relojes de pulsera para niñas

Y esa info que la pegue en un excel.

Pongo el código que tengo en spoiler por si alguien quiere molestarse en mirarlo:

spoiler

Puede ser que Amazon no permita scraping? He visto en páginas anteriores que hay herramientas que de forma relativamente barato pueden sacar la info que quiera, pero no sé si vale la pena para lo poco que necesito.

Qué pensáis?

1 respuesta
desu

#1884 Lo que tienes que hacer es entrar a las paginas de amazon y descargarte el html.

Cliente python de http, y un GET a la pagina que quieras.

Si miras el codigo del html, veras que lo que buscas esta dentro de un div concreto.

Lo podrias sacar con una regex o usandosela una libreria como https://pypi.org/project/beautifulsoup4/. Si le pides a chatgpt te generare la regex y el codigo en python. Yo lo hago mucho para html, te lo hace bien... le digo a chatgpt, generame regex en python para extraer esta información de la pagina html... y suelo hacerlo bien en un par de iteraciones y poniendole varios tests para refinarlo.

Una vez tienes la informacion lo cargas al excel o lo guardas en un csv. https://docs.python.org/3/library/csv.html

Y mira, si tienes un archivo .csv siempre lo puedes copiar a mano una vez al dia. Trabajar con csv es super facil y no tendras problemas como con excel.

Trabajo? No creo que sean mas de 2h de trabajo para cualquier ingeniero. Ponle 3-4h si te lo hace bien.

El problema es que a la larga el codigo se va a romper porque amazon cambiara el html, porque haras muchas peticiones a amazon por segundo y quizas te bloquean. Por eso se debe hacer "bien" el codigo y no una chapuza.

Pero vamos yo creo que quizas por 500 euros te lo hace alguien del foro sin problema. Eso como maximo lo que yo pagaria. Pasate por el hilo de juniors y a ver si alguien se ofrece por 100 o 200.

Tu codigo por lo que veo mas o menos lo hace, aunque no lo de la mejor manera.

7 1 respuesta
hitsvil

#1885 mil gracias no, dos mil gracias!

Cerealfriend

#1882 Ahora mismo lo estamos usando en uno de los proyectos y va como un tiro

1