Search code examples
databricksazure-databricksdatabricks-notebook

How to display markdown output in databricks notebook from a python cell


With IPython/Jupyter it's possible to output markdown using the IPython display module and its MarkDownclass.

Example markdown output

Question

How can I accomplish this with Azure Databricks?

What I tried

Databricks display

Tried using Databrick's display with the IPython Markdown class:

from IPython.display import Markdown
display(Markdown('*some markdown* test'))

but this results in the following error:

Exception: Cannot call display(<class 'IPython.core.display.Markdown'>)

IPython display

I then tried to use IPython's display:

from IPython.display import display, Markdown
display(Markdown('*some markdown* test'))

but this just displays the text:

<IPython.core.display.Markdown object>

Example failed ouput

IPython display_markdown

Tried using IPython's display_markdown:

from IPython.display import display_markdown
display_markdown('# Markdown is here!\n*some markdown*\n- and\n- some\n- more')

but this results in nothing showing up:

Failed display_markdown

Looking up documentation

Also tried checking Azure Databricks documentation. At first I visited https://www.databricks.com/databricks-documentation which leads me to https://learn.microsoft.com/en-ca/azure/databricks/ but I wasn't able to find anything via searching or clicking the links and I usually find Microsoft documentation quite good.

Checking Databrick's display source

As Saideep Arikontham mentioned in the comments, Databricks version 11 and above is using IPython kernel so I dug a bit deeper.

According to Databrick's source for the display function, it will readily render any object that implements _repr_html().

Databricks display

However I'm having a hard time being able to get the raw html output that I'm assuming IPython.display.Markdown should be able to output. I can only find _repr_markdown_() and _data_and_metadata() where the former just calls the latter and the output, at least in Databricks, is just the original raw markdown string.


Solution

  • Markdown and display_markdown are not giving desired output when used in Azure Databricks. I have done the following in Databricks 11.1 runtime.

    • Taking inputs from the question, I understood that when a class has _repr_html(), it is able to output the desired result. But when this method is absent in class, it is returning an object.
    • So, for Markdown to work, I have written my own Markdown class where I used Python's markdown library.
    from IPython.display import DisplayObject, TextDisplayObject
    
    class Markdown(TextDisplayObject):
    
        def __init__(self,TextDisplayObject):
            import markdown as md
            
            #converting markdown to html
            self.html = md.markdown(TextDisplayObject)
            
        
        def _repr_html_(self):
            return self.html
    
    • Now, this class is not completely same as the IPython.display.Markdown. I have formatted your sample markdown '# Markdown is here!\n*some markdown*\n- and\n- some\n- more' as following to get the desired result.
    Markdown('''# Markdown is here!\n
    *some markdown*\n
    - and\n
    - some\n
    - more''')
    

    enter image description here

    NOTE:

    • For display_markdown() to display output, we must specify another argument raw as True (display_markdown(<markdown_str>, raw=True)). However, in Databricks it is returning undefined (NoneType).

    • Please do install markdown library first using %pip install markdown in Databricks cell.