{"id":765,"date":"2018-01-13T09:29:49","date_gmt":"2018-01-13T09:29:49","guid":{"rendered":"https:\/\/techvidvan.com\/tutorials\/?p=765"},"modified":"2018-01-13T09:29:49","modified_gmt":"2018-01-13T09:29:49","slug":"spark-catalyst-optimizer","status":"publish","type":"post","link":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/","title":{"rendered":"Spark SQL Optimization- The Spark Catalyst Optimizer"},"content":{"rendered":"<p>In this Spark tutorial, we will learn about Spark SQL optimization &#8211; Spark catalyst optimizer framework. <strong>Optimization<\/strong> refers to a process in which we use fewer resources, yet it works <span class=\"adverb\">efficiently<\/span>.<\/p>\n<p>We will learn, how it allows developers to express the complex query in few lines of code, the role of catalyst optimizer in spark. At last, we will also focus on its fundamentals of working and includes phases of Spark execution flow.<\/p>\n<div id=\"attachment_73293\" style=\"width: 1210px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/sites\/2\/2019\/11\/SPARK-SQL-Optimization.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-73293\" class=\"size-full wp-image-73293\" src=\"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/sites\/2\/2019\/11\/SPARK-SQL-Optimization.jpg\" alt=\"spark catalyst optimizer\" width=\"1200\" height=\"628\" \/><\/a><p id=\"caption-attachment-73293\" class=\"wp-caption-text\">Spark Catalyst Optimizer \u2013 Spark SQL Optimization<\/p><\/div>\n<h3>Spark SQL Optimization<\/h3>\n<p>First, let&#8217;s understand the term<strong> Optimization<\/strong>. It means the design of the system is in a way that it works efficiently with fewer resources. One of the components of Apache Spark ecosystem is Spark SQL.<\/p>\n<p>At the very core of Spark SQL is catalyst optimizer. It is based on functional programming construct in Scala. Advanced programming language feature is one of the advantages of\u00a0catalyst optimizer. It includes Scala\u2019s pattern matching and quasi quotes. Also, offers to build an extensible query optimizer.<\/p>\n<p>Furthermore, catalyst optimizer in Spark offers both <em>rule-based<\/em> and <em>cost-based<\/em> optimization as well. But, In rule-based optimization, there are set of rule to determine how to execute the query. While in cost-based by using rules many plans <span class=\"passivevoice\">are generated<\/span> and then their cost <span class=\"passivevoice\">is computed<\/span>.<\/p>\n<p>In addition, there is a general library to show trees and apply rules to manipulate them. There are libraries specific to relational query processing, on top of this framework, for example, expressions, logical query plans.<\/p>\n<p>It also attains the various set of rules for different phases of query execution such as analysis, logical optimization, physical planning, and code generation. These are used to compile parts of queries to Java bytecode.<\/p>\n<p>Moreover, it uses another Scala feature, quasi quotes. That makes it easy to generate code at runtime from composable expressions. Ultimately, catalyst offers several public extension points, including external data sources &amp; user-defined types.<\/p>\n<h3>Role of Catalyst Optimizer in Apache Spark<\/h3>\n<p>There are two purposes to design catalyst optimizer, like:<\/p>\n<ul>\n<li>To add easily new optimization techniques and features to Spark SQL. For the purpose of handling various problems going with big data issues like semistructured data and advanced analytics.<\/li>\n<li>To enable external developers to extend the optimizer.<\/li>\n<\/ul>\n<h3>Fundamentals of Apache Spark Catalyst Optimizer<\/h3>\n<p>Let\u2019s discuss the tree and rules one by one in detail-<\/p>\n<h4>1. Trees<\/h4>\n<p>Tree constituted is the main data type in a catalyst. Each node has a node and can have zero or more children. In Scala, new node types <span class=\"passivevoice\">are explained<\/span> as subclasses of the tree node class. Since these objects are<em> immutable<\/em> in nature. By using functional transformations, we can manipulate them <span class=\"adverb\">easily<\/span>.<\/p>\n<p>By using a simple example, suppose for a very simple expression language, we have 3 node classes:<\/p>\n<ul>\n<li>Lit(value: Int): a constant value<\/li>\n<li>Att(name: String): an attribute from an input row, e.g.,\u201cx\u201d<\/li>\n<li>Add1(left: TreeNode, right: TreeNode): sum of two expressions.<\/li>\n<\/ul>\n<p>To build up trees, we use all of these, for example,\u00a0 we can represent a tree, for\u00a0an expression like x+(1+2) in Scala code as follows:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">Add(Att(x), Add(Lit(1), Lit(2)))<\/pre>\n<div id=\"attachment_73057\" style=\"width: 1210px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/sites\/2\/2019\/11\/Apache-Spark-SQL-01.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-73057\" class=\"wp-image-73057 size-full\" src=\"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/sites\/2\/2019\/11\/Apache-Spark-SQL-01.jpg\" alt=\"Spark Catalyst Optimizer - fundamentals\" width=\"1200\" height=\"628\" \/><\/a><p id=\"caption-attachment-73057\" class=\"wp-caption-text\">Fundamentals of Apache Spark Catalyst Optimizer &#8211; Spark SQL Optimization<\/p><\/div>\n<h4>2. Rules<\/h4>\n<p>By using rules, we can manipulate trees. Those are functions from a tree to another tree. By using rule we can run arbitrary code on its input tree. Moreover, this approach is to use a set of pattern matching functions.<\/p>\n<p>That find and replace subtrees with a specific structure, trees offer a transform method in a catalyst. On all nodes of a tree, we apply pattern matching method recursively. Through, transforming the ones it matches each pattern to a result.<\/p>\n<p>By using this example, implementing a rule, that folds add operations between constants:<\/p>\n<p><strong>For Example<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tree.transform {\n\ncase Add(Lit(c1), Lit(c2)) =&gt; Lit(c1+c2)\n\n}<\/pre>\n<p>On applying this to the tree for x+(1+2), it would make the new tree x+3. In this expression, case keyword is Scala\u2019s standard pattern matching syntax, we use it to match the type of an object. It also used to give names to extracted values (c1 and c2 here).<\/p>\n<p>An expression of pattern matching is passed to transform is a partial function. That means, it only needs to match to a subset of all possible input trees.<\/p>\n<p>It is monitor by a catalyst, which parts of a tree is, skipping over and descending into subtrees that do not match. Therefore, as we add new types of operators to the system, so no need to modify rules.<\/p>\n<p>In the same transform call, rules can match multiple patterns. It makes it very concise to implement multiple transformations at once:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tree.transform {\n\n\u00a0case Add(Lit(c1), Lit(c2)) =&gt; Lit(c1+c2)\n\n\u00a0case Add(left, Lit(0)) =&gt; left\n\n\u00a0case Add(Lit(0), right) =&gt; right\n\n}<\/pre>\n<p>Furthermore, to fully transform a tree, rules may need to execute multiple times. Catalyst groups rules into batches, it executes each batch until it reaches a fixed point. In other words, until the tree stops changing after applying its rules.<\/p>\n<p>Ultimately, rule conditions contain arbitrary Scala code. It provides catalyst more power than domain-specific languages for optimizers while keeping it concise for simple rules.<\/p>\n<p>While on immutable trees, it applies functional transformations. That makes the optimizer very easy to debug. Also, enables parallelization in the optimizer.<\/p>\n<h3>Using Catalyst in Spark SQL<\/h3>\n<p>There are 4 phases in which we can use catalyst\u2019s general tree transformation framework. This is list-up below:<\/p>\n<ul>\n<li>By analyzing a logical plan to resolve references.<\/li>\n<li>With logical plan optimization.<\/li>\n<li>By Physical Planning.<\/li>\n<li>With code generation to compile parts of the query to Java bytecode.<\/li>\n<\/ul>\n<p>In the third phase, which is physical planning catalyst may generate many plans. They also compare them on the basis of cost. All phases are rule-based except this phase. In each phase, it uses different types of tree nodes. Let\u2019s now discuss each of these phases.<\/p>\n<div id=\"attachment_73290\" style=\"width: 1210px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/sites\/2\/2019\/11\/Spark-SQL-Execution-Plan.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-73290\" class=\"wp-image-73290 size-full\" src=\"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/sites\/2\/2019\/11\/Spark-SQL-Execution-Plan.jpg\" alt=\"Spark Catalyst Optimizer - Spark Execution plan\" width=\"1200\" height=\"628\" \/><\/a><p id=\"caption-attachment-73290\" class=\"wp-caption-text\">Spark SQL Optimization &#8211; Spark Execution plan<\/p><\/div>\n<h4>1. Analysis<\/h4>\n<p>The first phase Spark SQL optimization is analysis. Initially, Spark SQL starts with a relation to be computed. It can be computed by two possible ways, either from an abstract syntax tree (AST) returned by a SQL parser. Using API, a second\u00a0way is from a dataframe object constructed.<\/p>\n<p>Moreover, on applying any case the relation remains unresolved attribute relations such as, in the SQL query SELECT col FROM sales, or even if it is a valid column name, is not known, until we look up the table.<\/p>\n<p>An attribute remains unresolved if we do not know its type to an input table. To resolve these, SQL uses catalyst rules that track tables in all data sources. It begins by building an \u201cunresolved logical plan\u201d tree with attributes &amp; data types. Afterwards, applies rules that do the following :<\/p>\n<p>&#8211;\u00a0 Searching relations as the name of the catalog.<\/p>\n<p>&#8211; \u00a0On mapping named attributes.<\/p>\n<p>&#8211; \u00a0When determining which attributes is similar to a value gives them a unique ID.<\/p>\n<p>&#8211; \u00a0By propagating and pushing types through expressions<\/p>\n<h4>2. Logical Optimization<\/h4>\n<p>It is the second phase of Spark SQL optimization. In this phase, we apply standard rule-based optimization to the logical plan. There are several rules in this process, for example, predicate pushdown, constant folding and many other rules. Ultimately, it became very easy to add a rule for various situations.<\/p>\n<h3>Spark Catalyst Optimizer- Physical Planning<\/h3>\n<p>In physical planning rules, there are about 500 lines of code. From the logical plan, we can form one or more physical plan, in this phase. Actually, by using the cost mode, it selects the plan. Only to select join algorithms, it uses cost-based optimization.<\/p>\n<p>The framework supports broader use of cost-based optimization, especially for all relations which are small. Moreover, By using this rule, it can estimate the cost recursively for the whole tree.<\/p>\n<p>Pipelining projections or filters operation, which is physical optimization is also carried out. These projections are rule-based optimizations and it can push operations from the logical plan into data sources. That support predicate or projection pushdown.<\/p>\n<h3>Code Generation In Spark Catalyst Optimizer<\/h3>\n<p>The code generation is the final phase of SparkSQL optimization. To run on each machine, generation of Java bytecode is involved in it. Also, make code generation easier, as catalyst uses the special Scala feature, \u201cQuasiquotes\u201d. Else, it is very tough to build code generation engines.<\/p>\n<p>We can construct of abstract syntax trees (ASTs) in Scala, using Quasi-quotes. That can <span class=\"passivevoice\">be given<\/span> to the Scala compiler at runtime to generate bytecode. Furthermore, We can easily transform a tree representing an expression in SQL to an AST.<\/p>\n<p><span class=\"adverb\">Especially<\/span>, for Scala code by using a catalyst. Also,\u00a0 helps to <span class=\"complexword\">evaluate<\/span> that expression and then compile and run the generated code.<\/p>\n<h3>Conclusion<\/h3>\n<p>In this blog post, we have covered the internals of Catalyst optimizer in SparkSQL. As a result, use of SQL optimization increases the performance of the queries that they write. Therefore, in\u00a0Spark SQL\u00a0optimization enhances the productivity of developers.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this Spark tutorial, we will learn about Spark SQL optimization &#8211; Spark catalyst optimizer framework. Optimization refers to a process in which we use fewer resources, yet it works efficiently. We will learn,&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":73293,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[614],"tags":[705,706,707,708,709,710,711,712,713,714,715],"class_list":["post-765","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apache-spark","tag-deep-dive-into-spark-sqls-catalyst-optimizer","tag-optimizing-apache-spark-sql","tag-spark-sql-catalyst-optimizer","tag-spark-sql-optimization","tag-spark-sql-optimization-understanding-the-catalyst-optimizer","tag-spark-sqls-catalyst-optimizer","tag-sparksql-optimization","tag-sql-optimization-in-spark","tag-sqls-catalyst-optimizer-in-apache-spark","tag-sqls-catalyst-optimizer-in-spark","tag-understanding-the-catalyst-optimizer"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Spark SQL Optimization- The Spark Catalyst Optimizer - TechVidvan<\/title>\n<meta name=\"description\" content=\"Spark Catalyst Optimizer - introduction of SparkSQL optimization,rules of catalyst optimizer in spark,Spark SQL execution plan,why catalyst optimization in spark\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spark SQL Optimization- The Spark Catalyst Optimizer - TechVidvan\" \/>\n<meta property=\"og:description\" content=\"Spark Catalyst Optimizer - introduction of SparkSQL optimization,rules of catalyst optimizer in spark,Spark SQL execution plan,why catalyst optimization in spark\" \/>\n<meta property=\"og:url\" content=\"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/\" \/>\n<meta property=\"og:site_name\" content=\"TechVidvan\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/TechVidvan\/\" \/>\n<meta property=\"article:published_time\" content=\"2018-01-13T09:29:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2019\/11\/SPARK-SQL-Optimization.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"TechVidvan Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@vidvantech\" \/>\n<meta name=\"twitter:site\" content=\"@vidvantech\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"TechVidvan Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spark SQL Optimization- The Spark Catalyst Optimizer - TechVidvan","description":"Spark Catalyst Optimizer - introduction of SparkSQL optimization,rules of catalyst optimizer in spark,Spark SQL execution plan,why catalyst optimization in spark","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:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/","og_locale":"en_US","og_type":"article","og_title":"Spark SQL Optimization- The Spark Catalyst Optimizer - TechVidvan","og_description":"Spark Catalyst Optimizer - introduction of SparkSQL optimization,rules of catalyst optimizer in spark,Spark SQL execution plan,why catalyst optimization in spark","og_url":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/","og_site_name":"TechVidvan","article_publisher":"https:\/\/www.facebook.com\/TechVidvan\/","article_published_time":"2018-01-13T09:29:49+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2019\/11\/SPARK-SQL-Optimization.jpg","type":"image\/jpeg"}],"author":"TechVidvan Team","twitter_card":"summary_large_image","twitter_creator":"@vidvantech","twitter_site":"@vidvantech","twitter_misc":{"Written by":"TechVidvan Team","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/#article","isPartOf":{"@id":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/"},"author":{"name":"TechVidvan Team","@id":"https:\/\/techvidvan.com\/tutorials\/#\/schema\/person\/e9c26e74dd3d87421f7ada9433b8cd22"},"headline":"Spark SQL Optimization- The Spark Catalyst Optimizer","datePublished":"2018-01-13T09:29:49+00:00","mainEntityOfPage":{"@id":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/"},"wordCount":1468,"commentCount":0,"publisher":{"@id":"https:\/\/techvidvan.com\/tutorials\/#organization"},"image":{"@id":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/#primaryimage"},"thumbnailUrl":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2019\/11\/SPARK-SQL-Optimization.jpg","keywords":["Deep Dive into Spark SQL's Catalyst Optimizer","Optimizing Apache Spark SQL","Spark SQL catalyst optimizer","Spark SQL optimization","Spark SQL Optimization - Understanding the Catalyst Optimizer ..","spark SQL's Catalyst Optimizer","sparkSQL optimization","SQL Optimization in spark","SQL's Catalyst Optimizer in apache spark","SQL's Catalyst Optimizer in spark","Understanding the Catalyst optimizer"],"articleSection":["Spark Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/","url":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/","name":"Spark SQL Optimization- The Spark Catalyst Optimizer - TechVidvan","isPartOf":{"@id":"https:\/\/techvidvan.com\/tutorials\/#website"},"primaryImageOfPage":{"@id":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/#primaryimage"},"image":{"@id":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/#primaryimage"},"thumbnailUrl":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2019\/11\/SPARK-SQL-Optimization.jpg","datePublished":"2018-01-13T09:29:49+00:00","description":"Spark Catalyst Optimizer - introduction of SparkSQL optimization,rules of catalyst optimizer in spark,Spark SQL execution plan,why catalyst optimization in spark","breadcrumb":{"@id":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/#primaryimage","url":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2019\/11\/SPARK-SQL-Optimization.jpg","contentUrl":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2019\/11\/SPARK-SQL-Optimization.jpg","width":1200,"height":628,"caption":"Spark Catalyst Optimizer \u2013 Spark SQL Optimization"},{"@type":"BreadcrumbList","@id":"https:\/\/techvidvan.com\/tutorials\/spark-catalyst-optimizer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/techvidvan.com\/tutorials\/"},{"@type":"ListItem","position":2,"name":"Spark SQL Optimization- The Spark Catalyst Optimizer"}]},{"@type":"WebSite","@id":"https:\/\/techvidvan.com\/tutorials\/#website","url":"https:\/\/techvidvan.com\/tutorials\/","name":"TechVidvan Blogs","description":"","publisher":{"@id":"https:\/\/techvidvan.com\/tutorials\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/techvidvan.com\/tutorials\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/techvidvan.com\/tutorials\/#organization","name":"TechVidvan","url":"https:\/\/techvidvan.com\/tutorials\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/techvidvan.com\/tutorials\/#\/schema\/logo\/image\/","url":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2024\/03\/techvidvan-logo-200x50-1.webp","contentUrl":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2024\/03\/techvidvan-logo-200x50-1.webp","width":200,"height":50,"caption":"TechVidvan"},"image":{"@id":"https:\/\/techvidvan.com\/tutorials\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/TechVidvan\/","https:\/\/x.com\/vidvantech"]},{"@type":"Person","@id":"https:\/\/techvidvan.com\/tutorials\/#\/schema\/person\/e9c26e74dd3d87421f7ada9433b8cd22","name":"TechVidvan Team","description":"The TechVidvan Team delivers practical, beginner-friendly tutorials on programming, Java, Python, C++, DSA, AI, ML, data Science, Android, Flutter, MERN, Web Development, and technology. Our experts are here to help you upskill and excel in today\u2019s tech industry."}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/posts\/765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/comments?post=765"}],"version-history":[{"count":0,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/posts\/765\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/media\/73293"}],"wp:attachment":[{"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/media?parent=765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/categories?post=765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/tags?post=765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}