Optimización de Databricks Python
Necesito tu ayuda por favor, tengo un código simple en Python que enumera todos los campos en las tablas de todas las bases de datos que están en Databricks, hay aproximadamente 90 tablas y me gustaría guardar el resultado en un archivo txt o csv. Aquí está el código utilizado, funciona pero tarda 8 horas en terminar, es demasiado tiempo ¿cómo puedo optimizarlo o tener otra forma para que sea más rápido?
<h1>tabla que contiene todos los nombres de base de datos en Databricks</h1>
<h1>df_tables = spark.sql("SELECT * FROM bdxyh_name")</h1>
<h1>DynoSQL es una tabla de tipo string para el resultado en txt</h1>
def discribe():
try:
for i in df_tables.collect():
showTables=""""show tables in {};" """.format(i.nombd)
df1=spark.sql(showTables)
for j in df1.collect():
describeTable=""""describe table {0}.{1};" """.format(j.database,j.tableName)
df2=spark.sql(describeTable)
#df3=df2.collect()
df3 = df2.rdd.toLocalIterator()
for k in df3:
#df=df2.select(df2.colname;k.data_type)
#spark.sql("insert into NewTable VALUES ("+j.database+";"+j.tableName+";"+k.colname+";"+k.data_type+");")
spark.sql("insert into DynoSQL select \""+j.database+";"+j.tableName+";"+k.colname+";"+k.data_type+"\"")
# request="insert into NewTable VALUES ({};{};{};{});""".format(j.database,j.tableName,k.colname,k.data_type)
#spark.sql(request)
except:
raise
davy.ai
Hay algunas cosas que se podrían hacer para optimizar este código:
rdd.toLocalIterator()
, utilizardf2.collect()
para devolver un DataFrame. Los RDDs son más lentos y menos eficientes que los DataFrames.Minimizar las consultas SQL: En lugar de utilizar una consulta SQL para obtener todas las tablas en cada base de datos y luego una consulta SQL para describir cada tabla, utilizar una sola consulta SQL para describir todas las tablas a la vez. Esto reducirá significativamente el número de consultas SQL que se ejecutan y mejorará el rendimiento.
Utilizar inserción masiva: En lugar de utilizar un bucle para insertar cada fila en
DynoSQL
, utilizar inserción masiva para insertar todas las filas a la vez. Esto mejorará aún más el rendimiento.Reducir el tamaño de los datos: Si hay columnas innecesarias que se están obteniendo, eliminarlas para reducir la cantidad de datos que se transfieren y procesan.
Aquí tienes una versión optimizada del código:
Cambios realizados en el código optimizado:
rdd.toLocalIterator()
.Se utilizó una sola consulta SQL para describir todas las tablas en todas las bases de datos.
Se utilizó la inserción masiva para escribir los resultados en un archivo CSV.
Se redujeron las columnas que se obtienen a solo las columnas necesarias.
En general, estos cambios deberían mejorar significativamente el rendimiento del código.