{"id":794,"date":"2020-10-24T19:39:52","date_gmt":"2020-10-24T19:39:52","guid":{"rendered":"https:\/\/justinmatters.co.uk\/wp\/?p=794"},"modified":"2020-10-24T19:39:52","modified_gmt":"2020-10-24T19:39:52","slug":"getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks","status":"publish","type":"post","link":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/","title":{"rendered":"Getting jobs with bespoke libraries to run programatically on Databricks"},"content":{"rendered":"<p>Previously I have scheduled PySpark jobs using Airflow, Papermill and the Databricks Jobs API. However Databricks has an automation system built in for running automated jobs on a schedule which can be useful for your simple automation tasks. You can find the documentation here: <a href=\"https:\/\/docs.databricks.com\/jobs.html\">https:\/\/docs.databricks.com\/jobs.html<\/a><\/p>\n<p>I decided to use this built in scheduler to simplify the workflow on a daily batch process recently. However I ran across a small wrinkle which surprised me. I am providing the solution here in the hope it might save a few people some googling and puzzling over documentation.<\/p>\n<h3>The Problem<\/h3>\n<p>When you create a cluster in Databricks you can usually edit the cluster and add libraries via the Libraries tab. This is useful if you want to use unusual or bespoke libraries in your code.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-796 size-large\" src=\"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries-700x595.png\" alt=\"Standard cluster creation with wide variety of library install options\" width=\"700\" height=\"595\" srcset=\"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries-700x595.png 700w, https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries-300x255.png 300w, https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries-768x653.png 768w, https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries.png 881w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>When you go to set up a job in Databricks you define a cluster. However this cluster definition does not give you a libraries tab. Some poking about leads you to the following documentation <a href=\"https:\/\/kb.databricks.com\/jobs\/job-fails-no-library.html\">https:\/\/kb.databricks.com\/jobs\/job-fails-no-library<\/a>. This suggests that you instead define the required libraries as dependent libraries in the job definition. This seems reasonable, but when the job definition allows you to specify dependent libraries it is far more restrictive in how you can install the library.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-797 size-large\" src=\"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/dependent-700x178.png\" alt=\"Job creation dependent library options are very limited\" width=\"700\" height=\"178\" srcset=\"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/dependent-700x178.png 700w, https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/dependent-300x76.png 300w, https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/dependent-768x196.png 768w, https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/dependent.png 1009w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>So how do you get jobs to run custom libraries from PyPi or Maven? You might think that you can simply point the job at one of your previously defined clusters, with their wider range of library options, but this is bad for two reasons.<\/p>\n<ol>\n<li>These are interactive clusters so they cost more than a scheduled job cluster should<\/li>\n<li>The jobs documents warn you that when running programmatic jobs you cannot be certain that the libraries will be available since the code may start running before the libraries have time to install!<\/li>\n<\/ol>\n<h3>The Solution<\/h3>\n<p>Clearly we need to do something else. I discovered that the simplest solution is to install the libraries to the shared workspace. You can find this described here <a href=\"https:\/\/docs.databricks.com\/libraries\/workspace-libraries.html\">https:\/\/docs.databricks.com\/libraries\/workspace-libraries.html<\/a>. You can then use the job setup page to add them as dependent libraries from the workspace. Your dependent libraries always load before any job starts to run. This avoids the availability issue noted above.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-799\" src=\"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/shared.png\" alt=\"\" width=\"611\" height=\"441\" srcset=\"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/shared.png 611w, https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/shared-300x217.png 300w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><\/p>\n<p>You install to the shared workspace by selecting <strong>Workspace<\/strong>. Then you hover over shared then select <strong>Create&gt;Library<\/strong>. The window that pops up will resemble the options you get when creating an interactive cluster including Maven and PyPi<\/p>\n<p>As a side benefit it used to be possible to specify that a library installed be automatically installed on all clusters preventing dependency issues if desired. However this no longer works with clusters on runtime &gt;= 7.0.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-798\" src=\"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/auto.png\" alt=\"\" width=\"1172\" height=\"451\" srcset=\"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/auto.png 1172w, https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/auto-300x115.png 300w, https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/auto-700x269.png 700w, https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/auto-768x296.png 768w\" sizes=\"auto, (max-width: 1172px) 100vw, 1172px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Previously I have scheduled PySpark jobs using Airflow, Papermill and the Databricks Jobs API. However Databricks has an automation system built in for running automated&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,5],"tags":[55,79,78],"class_list":["post-794","post","type-post","status-publish","format-standard","hentry","category-data-science","category-problem-solving","tag-databricks","tag-libraries","tag-scheduling"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Getting jobs with bespoke libraries to run programatically on Databricks - Justin&#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Getting jobs with bespoke libraries to run programatically on Databricks - Justin&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"Previously I have scheduled PySpark jobs using Airflow, Papermill and the Databricks Jobs API. However Databricks has an automation system built in for running automated&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/\" \/>\n<meta property=\"og:site_name\" content=\"Justin&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-24T19:39:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries-700x595.png\" \/>\n<meta name=\"author\" content=\"justinmatters\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"justinmatters\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/\"},\"author\":{\"name\":\"justinmatters\",\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/#\\\/schema\\\/person\\\/7c3e0740e1fef74f705c19f175f6f321\"},\"headline\":\"Getting jobs with bespoke libraries to run programatically on Databricks\",\"datePublished\":\"2020-10-24T19:39:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/\"},\"wordCount\":467,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/libraries-700x595.png\",\"keywords\":[\"Databricks\",\"Libraries\",\"Scheduling\"],\"articleSection\":[\"Data Science\",\"Problem Solving\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/\",\"url\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/\",\"name\":\"Getting jobs with bespoke libraries to run programatically on Databricks - Justin&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/libraries-700x595.png\",\"datePublished\":\"2020-10-24T19:39:52+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/#\\\/schema\\\/person\\\/7c3e0740e1fef74f705c19f175f6f321\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/#primaryimage\",\"url\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/libraries.png\",\"contentUrl\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/libraries.png\",\"width\":881,\"height\":749},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Getting jobs with bespoke libraries to run programatically on Databricks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/#website\",\"url\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/\",\"name\":\"Justin's Blog\",\"description\":\"Justin&#039;s Coding and Geek Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/#\\\/schema\\\/person\\\/7c3e0740e1fef74f705c19f175f6f321\",\"name\":\"justinmatters\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/27cf337940887c098b79716aa7025ce782bd51de3f6b07a9dcad710bbf576c59?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/27cf337940887c098b79716aa7025ce782bd51de3f6b07a9dcad710bbf576c59?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/27cf337940887c098b79716aa7025ce782bd51de3f6b07a9dcad710bbf576c59?s=96&d=mm&r=g\",\"caption\":\"justinmatters\"},\"description\":\"Data Scientist specialising in Python, PySpark, SQL and Machine Learning\",\"sameAs\":[\"https:\\\/\\\/justinmatters.co.uk\\\/wp\\\/\",\"https:\\\/\\\/uk.linkedin.com\\\/in\\\/justin-matters-edinburgh\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Getting jobs with bespoke libraries to run programatically on Databricks - Justin&#039;s Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/","og_locale":"en_US","og_type":"article","og_title":"Getting jobs with bespoke libraries to run programatically on Databricks - Justin&#039;s Blog","og_description":"Previously I have scheduled PySpark jobs using Airflow, Papermill and the Databricks Jobs API. However Databricks has an automation system built in for running automated&hellip;","og_url":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/","og_site_name":"Justin&#039;s Blog","article_published_time":"2020-10-24T19:39:52+00:00","og_image":[{"url":"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries-700x595.png","type":"","width":"","height":""}],"author":"justinmatters","twitter_card":"summary_large_image","twitter_misc":{"Written by":"justinmatters","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/#article","isPartOf":{"@id":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/"},"author":{"name":"justinmatters","@id":"https:\/\/justinmatters.co.uk\/wp\/#\/schema\/person\/7c3e0740e1fef74f705c19f175f6f321"},"headline":"Getting jobs with bespoke libraries to run programatically on Databricks","datePublished":"2020-10-24T19:39:52+00:00","mainEntityOfPage":{"@id":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/"},"wordCount":467,"commentCount":0,"image":{"@id":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/#primaryimage"},"thumbnailUrl":"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries-700x595.png","keywords":["Databricks","Libraries","Scheduling"],"articleSection":["Data Science","Problem Solving"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/","url":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/","name":"Getting jobs with bespoke libraries to run programatically on Databricks - Justin&#039;s Blog","isPartOf":{"@id":"https:\/\/justinmatters.co.uk\/wp\/#website"},"primaryImageOfPage":{"@id":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/#primaryimage"},"image":{"@id":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/#primaryimage"},"thumbnailUrl":"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries-700x595.png","datePublished":"2020-10-24T19:39:52+00:00","author":{"@id":"https:\/\/justinmatters.co.uk\/wp\/#\/schema\/person\/7c3e0740e1fef74f705c19f175f6f321"},"breadcrumb":{"@id":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/#primaryimage","url":"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries.png","contentUrl":"https:\/\/justinmatters.co.uk\/wp\/wp-content\/uploads\/2020\/10\/libraries.png","width":881,"height":749},{"@type":"BreadcrumbList","@id":"https:\/\/justinmatters.co.uk\/wp\/getting-jobs-with-bespoke-libraries-to-run-programatically-on-databricks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/justinmatters.co.uk\/wp\/"},{"@type":"ListItem","position":2,"name":"Getting jobs with bespoke libraries to run programatically on Databricks"}]},{"@type":"WebSite","@id":"https:\/\/justinmatters.co.uk\/wp\/#website","url":"https:\/\/justinmatters.co.uk\/wp\/","name":"Justin's Blog","description":"Justin&#039;s Coding and Geek Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/justinmatters.co.uk\/wp\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/justinmatters.co.uk\/wp\/#\/schema\/person\/7c3e0740e1fef74f705c19f175f6f321","name":"justinmatters","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/27cf337940887c098b79716aa7025ce782bd51de3f6b07a9dcad710bbf576c59?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/27cf337940887c098b79716aa7025ce782bd51de3f6b07a9dcad710bbf576c59?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/27cf337940887c098b79716aa7025ce782bd51de3f6b07a9dcad710bbf576c59?s=96&d=mm&r=g","caption":"justinmatters"},"description":"Data Scientist specialising in Python, PySpark, SQL and Machine Learning","sameAs":["https:\/\/justinmatters.co.uk\/wp\/","https:\/\/uk.linkedin.com\/in\/justin-matters-edinburgh"]}]}},"_links":{"self":[{"href":"https:\/\/justinmatters.co.uk\/wp\/wp-json\/wp\/v2\/posts\/794","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/justinmatters.co.uk\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/justinmatters.co.uk\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/justinmatters.co.uk\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/justinmatters.co.uk\/wp\/wp-json\/wp\/v2\/comments?post=794"}],"version-history":[{"count":3,"href":"https:\/\/justinmatters.co.uk\/wp\/wp-json\/wp\/v2\/posts\/794\/revisions"}],"predecessor-version":[{"id":801,"href":"https:\/\/justinmatters.co.uk\/wp\/wp-json\/wp\/v2\/posts\/794\/revisions\/801"}],"wp:attachment":[{"href":"https:\/\/justinmatters.co.uk\/wp\/wp-json\/wp\/v2\/media?parent=794"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/justinmatters.co.uk\/wp\/wp-json\/wp\/v2\/categories?post=794"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/justinmatters.co.uk\/wp\/wp-json\/wp\/v2\/tags?post=794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}