Forum Discussion
Spark Job Definition vs Notebooks
- Anonymous2 years ago
Hi DennesTorres ,
Yes, you are correct we need to use "spark.catalog", it will list out all the lakehouses present inside the workspace, even if not linked to the notebook.
Code:lakehouses = spark.catalog.listDatabases() lakehouse_list = [] for lakehouse in lakehouses: lakehouse_list.append(lakehouse.name) print(lakehouse_list)
In order get list of tables present inside particular lakehouse, you can refer below -
Code:# Get the list of lakehouses to read tables from. lakehouses = ["gopi_lake_house", "gopi_lakehouse_2"] # Loop through the lakehouses and read all tables from each lakehouse. for lakehouse in lakehouses: tables = spark.sql(f"SHOW TABLES IN {lakehouse}") tables.show()
Note: SHOW TABLES IN - will be working even if the lakehouse is not default. In my case only gopi_lakehouse_2 is selected as default, but I am able to see tables present inside gopi_lake_house and gopi_lakehouse_2.
For Example:
Executed in Fabric Notebooks:
Executed in Spark Job Application:
The above code is working fine both in notebook and spark job application.
Hope this was helpful. - 2 years ago
Hi,
Using the information provided until this point, I was able to write a code to make the maintenance of all lakehouses in the same workspace.
The Spark Job Definition, on the other way, can be linked to multiple workspaces. One of the workspace is turned into the default workspace while the other workspaces become a configuration.
We can loop through the configurations and use mssparkutils to make the mount of the lakehouse addresses as local folders.
Once mounted, we loop through the mounts discovering the tables of each lakehouse and executing the maintenance.
It worked like a charm, I will write an article about it.
Thank you for all the help!
Kind Regards,
Dennes
Hi,
Yes, but how do we make reference to them in the code of the notebook? How do we iterate among them?
I just tested this option. Even with multiple lakehouses attached to a notebook, the folder /lakehouse contains only one subfolder /default, for the default lakehouse. I don't know how to access the other ones in the pyspark code and iterate through them.
Kind Regards,
Dennes
Hi DennesTorres ,
Try using code:
# Get the list of lakehouses to read tables from.
lakehouses = ["gopi_lake_house", "gopi_lakehouse_2"]
# Loop through the lakehouses and read all tables from each lakehouse.
for lakehouse in lakehouses:
tables = spark.sql(f"SHOW TABLES IN {lakehouse}")
display(tables)
- DennesTorres2 years agoImpactful Individual
Hi,
The array becomes fixed in this example, I'm trying to achieve something more dynamic. But this may be an option.
Kind Regards,Dennes
- Anonymous2 years agoNot applicable
Hi DennesTorres ,
Can you please check this codelakehouses = catalog.listDatabases() lakehouse_list = [] for lakehouse in lakehouses: lakehouse_list.append(lakehouse.name) print(lakehouse_list)- Anonymous2 years agoNot applicable
Hello DennesTorres ,
We haven’t heard from you on the last response and was just checking back to see if you have a resolution yet . Otherwise, will respond back with the more details and we will try to help .
- DennesTorres2 years agoImpactful Individual
Hi,
Your example doesn't mention any import and the "catalog" doesn't work directly.I tried to use "spark.catalog", but it only list the default lakehouse and other lakehouses located in the same workspace, even if not linked to the notebook. It fails to list lakehouses linked with the notebook but which are not the default one.
Is this to be used with the notebook schedule, linking multiple lakehouses, or is this intended to be used with a spark job?
Or did I made the wrong import?
Kind Regards,
Dennes - DennesTorres2 years agoImpactful Individual
Hi,
I was trying the idea of the array as well, but I also need to recover the list of tables from each lakehouse.
The "Show Tables In ..." in your example only works for the default lakehouse. If the lakehouse is not the default, it doesn't work.
Kind Regards,Dennes
- DennesTorres2 years agoImpactful Individual
Hi,
Additional attempts I made:lakehouses = ["demolake", "MaltaLake","Sales"]for lake in lakehouses:spark.catalog.setCurrentDatabase(lake)spark.sql('show tables').show()The setCurrentDatabase fails in the second one, because it doesn't work with a database located in a different workspace than the default.lakehouses = ["demolake", "MaltaLake","Sales"]for lake in lakehouses:spark.sql(f'USE {lake}')spark.sql('show tables').show()
Same problem: USE doesn't work in a database in a different workspace than the default.Am I missing something?
Kind Regards,Dennes- Anonymous2 years agoNot applicable
Hi DennesTorres ,
Yes, you are correct we need to use "spark.catalog", it will list out all the lakehouses present inside the workspace, even if not linked to the notebook.
Code:lakehouses = spark.catalog.listDatabases() lakehouse_list = [] for lakehouse in lakehouses: lakehouse_list.append(lakehouse.name) print(lakehouse_list)
In order get list of tables present inside particular lakehouse, you can refer below -
Code:# Get the list of lakehouses to read tables from. lakehouses = ["gopi_lake_house", "gopi_lakehouse_2"] # Loop through the lakehouses and read all tables from each lakehouse. for lakehouse in lakehouses: tables = spark.sql(f"SHOW TABLES IN {lakehouse}") tables.show()
Note: SHOW TABLES IN - will be working even if the lakehouse is not default. In my case only gopi_lakehouse_2 is selected as default, but I am able to see tables present inside gopi_lake_house and gopi_lakehouse_2.
For Example:
Executed in Fabric Notebooks:
Executed in Spark Job Application:
The above code is working fine both in notebook and spark job application.
Hope this was helpful.