{"id":1004,"date":"2017-07-17T07:12:02","date_gmt":"2017-07-17T07:12:02","guid":{"rendered":"https:\/\/www.bsetec.com\/blog\/?p=1004"},"modified":"2017-07-17T07:12:02","modified_gmt":"2017-07-17T07:12:02","slug":"apache-spark-sql","status":"publish","type":"post","link":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/","title":{"rendered":"Apache Spark SQL"},"content":{"rendered":"<p><a href=\"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png\"><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter  wp-image-1005\" src=\"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png\" alt=\"sparksql\" width=\"630\" height=\"285\" srcset=\"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png 745w, https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql-300x136.png 300w\" sizes=\"(max-width: 630px) 100vw, 630px\" \/><\/p>\n<p><\/a><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Catalyst (sql\/catalyst) &#8211; An implementation-agnostic framework for manipulating trees of relational operators and expressions.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Execution (sql\/core) &#8211; A query planner \/ execution engine for translating Catalyst&#8217;s logical query plans into Spark RDDs. This component also includes a new public interface, SQLContext, that allows users to execute SQL or LINQ statements against existing RDDs and Parquet files.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Hive Support (sql\/hive) &#8211; Includes an extension of SQLContext called HiveContext that allows users to write queries using a subset of HiveQL and access data from a Hive Metastore using Hive SerDes. There are also wrappers that allows users to run queries that include Hive UDFs, UDAFs, and UDTFs.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">HiveServer and CLI support (sql\/hive-thriftserver) &#8211; Includes support for the SQL CLI (bin\/spark-sql) and a HiveServer2 (for JDBC\/ODBC) compatible server.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Spark SQL is one of the newest and most technically involved components of Spark. It powers both SQL queries and the new Data Frame API.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Spark SQL is the Catalyst optimizer, which leverages advanced programming language features such as Scala\u2019s pattern matching and quasi quotes in a novel way to build an extensible query optimizer. Catalyst supports both rule-based and cost-based optimization. It contains a general library for representing trees and applying rules to manipulate them.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">It offers several public extension points, including external data sources and user-defined types.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Catalyst\u2019s general tree transformation framework in four phases as<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"> analyzing a logical plan to resolve references, <\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"> logical plan optimization, <\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"> physical planning, and <\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"> code generation to compile parts of the query to Java bytecode.<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Catalyst may generate multiple plans and compare them based on cost. All other phases are purely rule-based. Each phase uses different types of tree <\/span><span style=\"font-weight: 400;\">nodes; Catalyst includes libraries of nodes for expressions, data types, and logical and physical operators.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Spark SQL takes a logical plan and generates one or more physical plans, using physical operators that match the Spark execution engine. It can push operations from the logical plan into data sources that support predicate or projection pushdown.<\/span><\/p>\n<p><b>Interfaces to Spark SQL:<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Spark SQL runs as a library on top of Spark. It exposes SQL interfaces, which can be accessed through JDBC\/ODBC or through a command-line console. DataFrame API integrated into Spark\u2019s. We start by covering the DataFrame API, which lets users intermix procedural and relational code. However, advanced functions can also be exposed in SQL through user-defined function<\/span> <span style=\"font-weight: 400;\">(<\/span><span style=\"font-weight: 400;\">UDFs), allowing them to be invoked, for example, by business intelligence tools.<\/span><\/p>\n<p><b>Goals for Spark SQL<\/b><\/p>\n<ol>\n<li><span style=\"font-weight: 400;\"> Support relational processing both within Spark programs (on native RDDs) and on external data sources using a programmer friendly API.<\/span><\/li>\n<li><span style=\"font-weight: 400;\"> Provide high performance using established DBMS techniques.<\/span><\/li>\n<li><span style=\"font-weight: 400;\"> Easily support new data sources, including semi-structured data and external databases amenable to query federation. <\/span><\/li>\n<li><span style=\"font-weight: 400;\"> Enable extension with advanced analytics algorithms such as graph processing and machine learning.<\/span><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Catalyst (sql\/catalyst) &#8211; An implementation-agnostic framework for manipulating trees of relational operators and expressions. Execution (sql\/core) &#8211; A query planner \/ execution engine for translating Catalyst&#8217;s logical query plans into Spark RDDs. This component also includes a new public interface, SQLContext, that allows users to execute SQL or LINQ statements against existing RDDs and Parquet [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1005,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1004","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Apache Spark SQL | BSEtec<\/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:\/\/www.bsetec.com\/blog\/apache-spark-sql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apache Spark SQL | BSEtec\" \/>\n<meta property=\"og:description\" content=\"Catalyst (sql\/catalyst) &#8211; An implementation-agnostic framework for manipulating trees of relational operators and expressions. Execution (sql\/core) &#8211; A query planner \/ execution engine for translating Catalyst&#8217;s logical query plans into Spark RDDs. This component also includes a new public interface, SQLContext, that allows users to execute SQL or LINQ statements against existing RDDs and Parquet [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/\" \/>\n<meta property=\"og:site_name\" content=\"BSEtec\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/bsetec\/\" \/>\n<meta property=\"article:published_time\" content=\"2017-07-17T07:12:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png\" \/>\n\t<meta property=\"og:image:width\" content=\"745\" \/>\n\t<meta property=\"og:image:height\" content=\"337\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"BSEtec\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@BSEtech\" \/>\n<meta name=\"twitter:site\" content=\"@BSEtech\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"BSEtec\" \/>\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:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/\"},\"author\":{\"name\":\"BSEtec\",\"@id\":\"https:\/\/www.bsetec.com\/blog\/#\/schema\/person\/24a8ed4eefa5e9bf112e896653ca21c4\"},\"headline\":\"Apache Spark SQL\",\"datePublished\":\"2017-07-17T07:12:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/\"},\"wordCount\":471,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.bsetec.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/\",\"url\":\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/\",\"name\":\"Apache Spark SQL | BSEtec\",\"isPartOf\":{\"@id\":\"https:\/\/www.bsetec.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png\",\"datePublished\":\"2017-07-17T07:12:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#primaryimage\",\"url\":\"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png\",\"contentUrl\":\"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png\",\"width\":745,\"height\":337},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.bsetec.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Apache Spark SQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.bsetec.com\/blog\/#website\",\"url\":\"https:\/\/www.bsetec.com\/blog\/\",\"name\":\"BSEtec\",\"description\":\"Exploring the World of Tech, One Byte at a Time\",\"publisher\":{\"@id\":\"https:\/\/www.bsetec.com\/blog\/#organization\"},\"alternateName\":\"BSEtec\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.bsetec.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.bsetec.com\/blog\/#organization\",\"name\":\"BSEtec\",\"url\":\"https:\/\/www.bsetec.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.bsetec.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2023\/01\/fav.ico\",\"contentUrl\":\"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2023\/01\/fav.ico\",\"width\":1,\"height\":1,\"caption\":\"BSEtec\"},\"image\":{\"@id\":\"https:\/\/www.bsetec.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/bsetec\/\",\"https:\/\/x.com\/BSEtech\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.bsetec.com\/blog\/#\/schema\/person\/24a8ed4eefa5e9bf112e896653ca21c4\",\"name\":\"BSEtec\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.bsetec.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/20fcfaf426a285886f813fd3e9e0ad48f22440b11201e9a669807c088bfdac8e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/20fcfaf426a285886f813fd3e9e0ad48f22440b11201e9a669807c088bfdac8e?s=96&d=mm&r=g\",\"caption\":\"BSEtec\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Apache Spark SQL | BSEtec","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:\/\/www.bsetec.com\/blog\/apache-spark-sql\/","og_locale":"en_US","og_type":"article","og_title":"Apache Spark SQL | BSEtec","og_description":"Catalyst (sql\/catalyst) &#8211; An implementation-agnostic framework for manipulating trees of relational operators and expressions. Execution (sql\/core) &#8211; A query planner \/ execution engine for translating Catalyst&#8217;s logical query plans into Spark RDDs. This component also includes a new public interface, SQLContext, that allows users to execute SQL or LINQ statements against existing RDDs and Parquet [&hellip;]","og_url":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/","og_site_name":"BSEtec","article_publisher":"https:\/\/www.facebook.com\/bsetec\/","article_published_time":"2017-07-17T07:12:02+00:00","og_image":[{"width":745,"height":337,"url":"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png","type":"image\/png"}],"author":"BSEtec","twitter_card":"summary_large_image","twitter_creator":"@BSEtech","twitter_site":"@BSEtech","twitter_misc":{"Written by":"BSEtec","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#article","isPartOf":{"@id":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/"},"author":{"name":"BSEtec","@id":"https:\/\/www.bsetec.com\/blog\/#\/schema\/person\/24a8ed4eefa5e9bf112e896653ca21c4"},"headline":"Apache Spark SQL","datePublished":"2017-07-17T07:12:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/"},"wordCount":471,"commentCount":0,"publisher":{"@id":"https:\/\/www.bsetec.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/","url":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/","name":"Apache Spark SQL | BSEtec","isPartOf":{"@id":"https:\/\/www.bsetec.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#primaryimage"},"image":{"@id":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png","datePublished":"2017-07-17T07:12:02+00:00","breadcrumb":{"@id":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#primaryimage","url":"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png","contentUrl":"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png","width":745,"height":337},{"@type":"BreadcrumbList","@id":"https:\/\/www.bsetec.com\/blog\/apache-spark-sql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.bsetec.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Apache Spark SQL"}]},{"@type":"WebSite","@id":"https:\/\/www.bsetec.com\/blog\/#website","url":"https:\/\/www.bsetec.com\/blog\/","name":"BSEtec","description":"Exploring the World of Tech, One Byte at a Time","publisher":{"@id":"https:\/\/www.bsetec.com\/blog\/#organization"},"alternateName":"BSEtec","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.bsetec.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.bsetec.com\/blog\/#organization","name":"BSEtec","url":"https:\/\/www.bsetec.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.bsetec.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2023\/01\/fav.ico","contentUrl":"https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2023\/01\/fav.ico","width":1,"height":1,"caption":"BSEtec"},"image":{"@id":"https:\/\/www.bsetec.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/bsetec\/","https:\/\/x.com\/BSEtech"]},{"@type":"Person","@id":"https:\/\/www.bsetec.com\/blog\/#\/schema\/person\/24a8ed4eefa5e9bf112e896653ca21c4","name":"BSEtec","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.bsetec.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/20fcfaf426a285886f813fd3e9e0ad48f22440b11201e9a669807c088bfdac8e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/20fcfaf426a285886f813fd3e9e0ad48f22440b11201e9a669807c088bfdac8e?s=96&d=mm&r=g","caption":"BSEtec"}}]}},"blog_post_layout_featured_media_urls":{"thumbnail":["https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql-150x150.png",150,150,true],"full":["https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png",745,337,false]},"categories_names":{"1":{"name":"Uncategorized","link":"https:\/\/www.bsetec.com\/blog\/category\/uncategorized\/"}},"tags_names":[],"comments_number":"0","wpmagazine_modules_lite_featured_media_urls":{"thumbnail":["https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql-150x150.png",150,150,true],"cvmm-medium":["https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png",300,136,false],"cvmm-medium-plus":["https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png",305,138,false],"cvmm-portrait":["https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png",400,181,false],"cvmm-medium-square":["https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png",600,271,false],"cvmm-large":["https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png",745,337,false],"cvmm-small":["https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png",130,59,false],"full":["https:\/\/www.bsetec.com\/blog\/wp-content\/uploads\/2017\/07\/sparksql.png",745,337,false]},"_links":{"self":[{"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/posts\/1004","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/comments?post=1004"}],"version-history":[{"count":3,"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/posts\/1004\/revisions"}],"predecessor-version":[{"id":1008,"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/posts\/1004\/revisions\/1008"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/media\/1005"}],"wp:attachment":[{"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/media?parent=1004"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/categories?post=1004"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bsetec.com\/blog\/wp-json\/wp\/v2\/tags?post=1004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}