Good morning all!!
Yesterday I was looking for a function that was able to write a single file CSV with pyspark in Azure Databricks but I did not find anything. So I've built my own function and I wanted to share my solution with the community and if it's possible create like a thread with different solutions for the same problem.
Sorry, because I commented the code in Spanish but basically the function does:
Save the dataframe you've created into a new directory (which is allocated inside the path you've defined and begin with 'temp_') and save the partition there using "coalesce(1)"
Rename the CSV file as you want and moves it to the desired path
Delete de temporary file
That's all! You have your unique CSV file
def escribe_fichero_unico(dataframe, path, file_name, file_format = 'csv'):
"""
Definición: (1) Genera carpeta temporal para guardar particiones que Spark genera por defecto
a la hora de guardar archivos, (2) Une todas las particiones en un único archivo, (3) Mueve este
archivo al directorio anterior y (4) Borra la carpeta temporal
Parámetros:
dataframe: dataframe que quieras guardar como fichero único
file_name: en formato string escribe nombre del archivo
file_format: en formato string escribe 'csv' o 'parquet'
path: en formato string escribe el path donde quieres guardar el csv
"""
import os
# 1) Guardamos el dataframe creando una carpeta temporal que guarda todas las particiones
path_temp = path + 'temp_' + file_name + '_trash'
if file_format == 'csv':
dataframe.coalesce(1).write.format('csv').mode('overwrite') \
.options(header="true", schema="true", delimiter=";") \
.save(path_temp)
else if file_format == 'parquet':
dataframe.coalesce(1).write.format("parquet").mode("overwrite") \
.save(path_temp)
# 2)Une todas las particiones en un único archivo
file_part = [file.path for file in dbutils.fs.ls(path_temp) if os.path.basename(file.path).startswith('part')][0]
# 3) Mueve este archivo al directorio anterior
dbutils.fs.mv(file_part, path + file_name + '.' + file_format)
# 4) Borra la carpeta temporal
dbutils.fs.rm(path_temp, True)
I hope this work for you as well :)
Related
chitown88 help me to find the json on this website : https://www.iwc.com/fr/fr/watch-collections/pilot-watches/iw329303-big-pilots-watch-43.html
It seems that you need to replace html by .productinfo.FR.json
Source : How to scrape specific information on a website
I would like to do the same output with this page : https://www.omegawatches.com/fr-fr/watch-omega-constellation-quartz-27-mm-12315276005001
But I cannot manage to scrape those informations because the page is dynamic and I cannot find the json data, I searched for hours.
Do you have any solutions in order to scrape the same output than the question source ?
There isn't anything special about this page. Just grab the right information with beautifulsoup:
import requests
from bs4 import BeautifulSoup
url = "https://www.omegawatches.com/fr-fr/watch-omega-constellation-quartz-27-mm-12315276005001"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
title = soup.title.text.split("|")[0].strip()
description = soup.select_one(".description-content").get_text(strip=True)
price = soup.select_one(".price").text
info = "\n".join(
tag.get_text(strip=True)
for tag in soup.select(
".product-info-details-right .li, .product-info-details-right li"
)
)
print(title)
print()
print(description)
print("-" * 80)
print(price)
print("-" * 80)
print(info)
Prints:
Constellation Quartz 27 mm - 123.15.27.60.05.001
L'esthétique particulièrement remarquable et intemporelle de la collection OMEGA Constellation se caractérise par l'originalité du cadran et la présence des fameuses griffes.Ce modèle brossé se distingue par un cadran en nacre blanche protégé par un verre saphir résistant aux rayures. La lunette sertie de diamants est montée sur un boîtier de 27 mm en acier inoxydable sur un bracelet également en acier inoxydable.Cette montre est animée par le calibre OMEGA 1376, un mouvement de précision à quartz.
--------------------------------------------------------------------------------
5 000,00 €
--------------------------------------------------------------------------------
Diamants
Entre‑corne :18 mm
Bracelet :acier
Boîtier :acier
Diamètre du boîtier :27 mm
Couleur du cadran :blanc
Verre :verre saphir bombé résistant aux rayures, traité antireflet à l’intérieur
Étanchéité :10 bars (100 mètres / 330 pieds)
Type de mouvement :quartz
Calibre :OMEGA 1376
Mouvement de précision à quartz, finition rhodiée.
Durée de vie de la pile :48 mois
Type :quartz
Swiss Made
GARANTIE 5 ANS
Paiement sécurisé
Livraison et retour offerts
i'm triying to parse a bunch of .docx files, using the docx module in python, with this code.
folder = selec_folder()
new_location = os.chdir(folder)
#p =os.getcwd()
#p = os.path.dirname(os.path.abspath(_file_))
#Una lista que guarda los nombres de los archivos con extension .docx
docs = [a for a in os.listdir(new_location) if a.endswith('.docx') and str(a[0]) !='~' ]
#patron regex para buscar lo indicado por el usurio, indicando que se igneren las mayusculas o minusculas
busqueda = re.compile(f'{objetivo}',re.I)
n2 = Document()
#loops para seleccionar cada archivo y luego cada parrafo, para verificar que se encuentre el contenido buscado
for para in docs:
print(f'Nombre del documento------------------>{para}')
doc = Document(para)
print(len(doc.paragraphs))
for i in range(len(doc.paragraphs)):
#print(len(doc.paragraphs[i].runs))
if busqueda.findall(doc.paragraphs[i].text):
p = doc.paragraphs[i].runs
print('this is the len of run -----: ',p)
for i in range(len(p)):
print(p.runs[i])
if p.runs[i].bold == True:
n2.add_run(p.runs[i].text).bold= True
elif doc.paragraphs.runs[i].italic == True:
n2.add_run(p.runs[i].text).italic= True
elif doc.paragraphs.runs[i].underline == True:
n2.add_run(p.runs[i].text).underline = True
## elif doc.paragraphs.runs[i].Font.math == True:
## n2.add_run(doc.paragraphs..runs[i].text).Font.math = True
##
else:
n2.add_run(" ")
#for run in doc.paragraphs[i]:
#salva el documento de word
nuevo_doc.save('Nuevo_documento.docx')
broot = tk.Tk()
broot.destroy()
mensaje = messagebox.showinfo('Proceso concluido','El documento ha sido generado satisfactoriamente')
os.system('start Nuevo_documento.docx')
basically, the programs asks the user to input a subject to look in the files, then ask the user to select a folder (or path) to work with, then it opens every .docx file in the folder, and looks every paragraph, until if finds what is looking for, if found, it copies the whole paragraph with the format (bold, italic, underline, etc), but after adding the if block that checks the runs im getting this error:
Traceback (most recent call last):
File "C:\Users\virlu\Desktop\vdfd\buscaTema1.0.py.py", line 98, in <module>
print(p.runs[i])
i understand that im stracting the objects from a comprehension list, but i can't seem to find a solucition for this, if anyone can held, thanks in advance.
AttributeError: 'list' object has no attribute 'runs'
I'm trying to import a .json into a database using MySQL workbench, but the "Table data import wizard" always end up with 0 records.
here's the first line of my .json:
{
"Title":"Fort de Villiers",
"Keywords":"Histoire",
"Descripion":"Le fort de Villiers est un ancien fort du système défensif de Paris, situé sur la commune de Noisy-le-Grand, dans le département français de Seine-Saint-Denis. Construit à la fin du XIXᵉ siècle, il faisait partie du système Séré de Rivières, destiné a établir un rideau défensif autour de Paris.",
"Images":["https://lh3.googleusercontent.com/proxy/J-7ut85_OfCJn33_EZcooBkGyjxGBXt5CifUJ_bGzHaZUHlT4XVYwNaIKpZ4hScn3ICcUMI12RZ4xzTxUGmN1LCK694hynag4zh68dLypDwQ_Gy9NwCIFweGTjkh3Wft4IMr0No1tFWbTQ6oBnmLgRaomsWzvoJrTa8=w296-h202-n-k-no","https://lh5.googleusercontent.com/p/AF1QipNs2wi72SiKVlLr1WHIPfAaATrXOfhswYWEIaOw=w296-h202-n-k-no","https://lh5.googleusercontent.com/p/AF1QipMIY16VgeazmwQAP7PB5biaq5p-9uE3OZ-zVYZB=w296-h202-n-k-no"],
"Lattitude":"48.833573",
"Longitude":"2.5463771",
"Map_url":"https://www.google.com/maps/place/Fort+de+Villiers/#48.833573,2.5463771,15z/data=!4m5!3m4!1s0x47e60e0d72beac57:0xd4b8549d2165eef7!8m2!3d48.8335733!4d2.5551319"
}
when i try to import it, i got those fields proposed:
Title : Text
Description : Text
Longitude : Double
Images : json
Map_url : Text
Keywords : Text
Lattitude : Double
With some research i found out that it may be that the "text" columns countains characters that doesn't fill the requiring format, but i didn't manage to get the right format.
Do i need to modify my .json to get a correct utf8 format?
I'm actually using mysql 8.
I'm pretty new with this JSON and AJAX staff, so I was following a tutorial on youtube: https://www.youtube.com/watch?v=rJesac0_Ftw&t=1029s.
The thing is that I have followed the steps exactly like in the video, but I get the following error:
VM34:1 Uncaught SyntaxError: Unexpected token / in JSON at position 0
at JSON.parse (<anonymous>)
at XMLHttpRequest.theRequest.onload (loader.js:5)
My JSON script:
[
{
"name":"一",
"sound": {
"kunyomi": ["ひと.つ"],
"onyomi": ["イチ"]
},
"description":"Representaba la unidad, el absoluto. Cuando funciona como componente, este carácter adquiere el significado de suelo o de techo según su posición: si se encuentra encima de otro componente, toma el significado de techo; si está debajo, de suelo. Todas las formas antiguas de los números están asociadas a fuerzas del universo y a la mitología. Los números pares son el ying y los impares son el yang.",
"examples":["-月[いちがつ] - Enero", "-日[ついたち] - Día uno", "-回[いっかい] - Dos veces", "-階[いっかい] - Primer Piso"]
},
{
"name":"ニ",
"sound": {
"kunyomi": ["ふた.つ"],
"onyomi": ["ニ、ジ"]
},
"description":"Representa el cielo 一 y la tierra 一, el ying y el yang. Al igual que en el caso de los numerales romanos, el kanji de dos es una simple duplicación del trazo horizontal que significa uno.",
"examples":["二月[にがつ] - Febrero", "二日[ふつか] - Día dos", "二回[にかい] - Dos veces"]
}
]
And I call that JSON with the following code:
var ourRequest = new XMLHttpRequest();
ourRequest.open('GET', 'http://127.0.0.1/japones_flat/kanjis_n5.json');
ourRequest.onload = function() {
"use strict";
var response = JSON.parse(ourRequest.responseText);
console.log(response[0]);
};
ourRequest.send();
I made a little research and it looks like the problem resides in the JSON.parse method, saying that the token "/" is making troubles. After that, I noticed that Dreamweaver had left by default a comment in my .json file, so I deleted it (Because it started with "/") but I keep getting this anoying error. Can you guys help me?
Thanks in advance!
Sorry for my English. I'm trying to select some data from a database table in order to insert the into a table from another database.
This is my code:
void Partes::Guardar_Solicitud()
{
hospital=QSqlDatabase::addDatabase("QSQLITE");
hospital.setDatabaseName("C:/Sqlite3/Hospital.sqlite");
if(hospital.open()){
qDebug()<<"8.Se ha conectado a la base de datos Hospital";
}else{
qDebug()<<"8.ERROR. No se ha conectado a la base de datos Hospital";
}
QSqlQuery seleccionar;
seleccionar.prepare("SELECT*FROM Partes WHERE N_Parte=:ID");
seleccionar.bindValue(":ID",ui->lineEditN_Parte->text());
if(seleccionar.exec())
{
qDebug()<<"9.Los datos del parte se han seleccionado correctamente";
}else{
qDebug()<<"9.ERROR. Los datos del parte no se han seleccionado correctamente";
qDebug()<<"9.ERROR:"<<seleccionar.lastError();
}
seleccionar.next();
QString _N_Solicitud = seleccionar.value(0).toByteArray().constData();
QString _Fecha_Emision = seleccionar.value(1).toByteArray().constData();
QString _Codigo_Equipo = seleccionar.value(2).toByteArray().constData();
QString _Equipo = seleccionar.value(3).toByteArray().constData();
QString _Marca = seleccionar.value(9).toByteArray().constData();
QString _Modelo = seleccionar.value(10).toByteArray().constData();
QString _N_Serie = seleccionar.value(11).toByteArray().constData();
QString _Localizacion = seleccionar.value(6).toByteArray().constData();
QString _Descripcion_Solicitud = seleccionar.value(19).toByteArray().constData();
empresa=QSqlDatabase::addDatabase("QSQLITE");
empresa.setDatabaseName("C:/Sqlite3/Empresa.sqlite");
if(empresa.open()){
qDebug()<<"10.Se ha conectado a la base de datos Empresa";
}else{
qDebug()<<"10.ERROR. No se ha conectado a la base de datos Empresa";
}
QSqlQuery seleccionar2;
seleccionar2.prepare("SELECT*FROM Tecnicos WHERE Nombre_Usuario='a' and Contraseña='7'");
if(seleccionar2.exec())
{
qDebug()<<"11.Los datos del usuario se han seleccionado correctamente";
}else{
qDebug()<<"11.ERROR. Los datos del usuario no se han seleccionado correctamente";
qDebug()<<"11.ERROR:"<<seleccionar2.lastError();
}
seleccionar2.next();
QString _Unidad_Hospitalaria = seleccionar2.value(5).toByteArray().constData();
QString _Unidad_Tecnica = seleccionar2.value(6).toByteArray().constData();
QString _Peticionario = seleccionar2.value(0).toByteArray().constData();
QString _Telefono = seleccionar2.value(8).toByteArray().constData();
QString _Tecnico_Asignado = seleccionar2.value(0).toByteArray().constData();
QString _Estado_Solicitud = seleccionar2.value(7).toByteArray().constData();
QSqlQuery guardar_s;
guardar_s.prepare("INSERT INTO Solicitudes_Trabajo (N_Solicitud, Fecha_Emision, Unidad_Hospitalaria,"
"Codigo_Equipo, Equipo, Marca)"
"VALUES (:N_Solicitud, :Fecha_Emision, :Unidad_Hospitalaria, :Codigo_Equipo, :Equipo,"
":Marca)");
guardar_s.bindValue(":N_Solicitud", _N_Solicitud);
guardar_s.bindValue(":Fecha_Emision", _Fecha_Emision);
guardar_s.bindValue(":Unidad_Hospitalaria", _Unidad_Hospitalaria);
guardar_s.bindValue(":Codigo_Equipo", _Codigo_Equipo);
guardar_s.bindValue(":Equipo", _Equipo);
guardar_s.bindValue(":Marca", _Marca);
if(guardar_s.exec( ))
{
ui->label_Guardar->setText("Solicitud guardada correctamente");
qDebug()<<"12.Los datos del parte se han guardado en la Solicitud de Trabajo";
}
else
{
ui->label_Guardar->setText("La solicitud no se ha guardado correctamente");
qDebug()<<"12.ERROR. Los datos del parte no se han guardado en la Solicitud de Trabajo";
qDebug()<<"12.ERROR:"<<guardar_s.lastError();
}
}
Table "Partes" belongs to the "Hospital" database.
Table "Solicitudes_Trabajo" belongs to the "Empresa" database.
This code works fine, and inserts the values into the table perfectly. But when I add more values to be inserted there appears a QSqlError.
This is the INSERT INTO code that doesn't work:
QSqlQuery guardar_s;
guardar_s.prepare("INSERT INTO Solicitudes_Trabajo (N_Solicitud, Fecha_Emision, Unidad_Hospitalaria, Codigo_Equipo,"
"Equipo, Marca, Modelo, N_Serie, Localizacion, Unidad_Tecnica, Peticionario, Telefono, "
"Descripcion_Solicitud, Tecnico_Asignado, Tipo_Solicitud, Estado_Solicitud) "
"VALUES (:N_Solicitud, :Fecha_Emision, :Unidad_Hospitalaria, :Codigo_Equipo, :Equipo, :Marca, :Modelo,"
":N_Serie, :Localizacion, :Unidad_Tecnica, :Peticionario, :Telefono, :Descripcion_Solicitud,"
":Tecnico_Asignado, :Tipo_Solicitud, :Estado_Solicitud)");
guardar_s.bindValue(":N_Solicitud", _N_Solicitud);
guardar_s.bindValue(":Fecha_Emision", _Fecha_Emision);
guardar_s.bindValue(":Unidad_Hospitalaria",_Unidad_Hospitalaria);
guardar_s.bindValue(":Codigo_Equipo", _Codigo_Equipo);
guardar_s.bindValue(":Equipo", _Equipo);
guardar_s.bindValue(":Marca", _Marca);
guardar_s.bindValue(":Modelo", _Modelo);
guardar_s.bindValue(":N_Serie", _N_Serie);
guardar_s.bindValue(":Localizacion", _Localizacion);
guardar_s.bindValue(":Unidad_Tecnica", _Unidad_Tecnica);
guardar_s.bindValue(":Peticionario", _Peticionario);
guardar_s.bindValue(":Telefono", _Telefono);
guardar_s.bindValue(":Descripcion_Solicitud", _Descripcion_Solicitud);
guardar_s.bindValue(":Tecnico_Asignado", _Tecnico_Asignado);
guardar_s.bindValue(":Tipo_Solicitud", "a");
guardar_s.bindValue(":Estado_Solicitud", _Estado_Solicitud);
QDebug:
7.Los datos del usuario se han mostrado correctamente
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
8.Se ha conectado a la base de datos Hospital
9.Los datos del parte se han seleccionado correctamente
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
10.Se ha conectado a la base de datos Empresa
11.Los datos del usuario se han seleccionado correctamente
12.ERROR. Los datos del parte no se han guardado en la Solicitud de Trabajo
12.ERROR: QSqlError("", "Parameter count mismatch", "")
Are these too much data to insert for Qt Creator? Why it is able to insert 6 values but it isn't able to insert 16 values?
Thanks for replying!
At the end it was a typo. I was trying to insert a value into a column called Localización by using:
guardar_s.prepare("INSERT INTO Solicitudes_Trabajo (Localizacion)
The problem is in the accent mark.