{"id":51086,"date":"2024-03-21T10:40:20","date_gmt":"2024-03-21T09:40:20","guid":{"rendered":"https:\/\/www.inovex.de\/?p=51086"},"modified":"2024-03-21T10:46:08","modified_gmt":"2024-03-21T09:46:08","slug":"snowpark-for-spark-users-what-you-need-to-know","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/","title":{"rendered":"Snowpark for Spark Users: What You Need to Know"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">From <\/span><span style=\"font-weight: 400;\">previous blog posts<\/span><span style=\"font-weight: 400;\">, we are now familiar with some basic concepts and features of Snowflake. In this post, we want to focus on a feature that will be of interest to those who already operate a data warehouse in Databricks, or with Apache Spark: Snowpark. Before diving into the topic, this article will first answer the fundamental question of what Snowpark is and how it differs from Spark.<\/span><!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#What-is-Snowpark\" >What is Snowpark?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#How-does-Snowpark-differ-from-Spark-under-the-hood\" >How does Snowpark differ from Spark under the hood?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#How-does-Snowpark-differ-from-Spark-in-use\" >How does Snowpark differ from Spark in use?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#Programming\" >Programming<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#Testing-and-Debugging\" >Testing and Debugging<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#Availability-of-Python-packages\" >Availability of Python packages<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#Loading-from-external-data-sources\" >Loading from external data sources<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"What-is-Snowpark\"><\/span><b>What is Snowpark?<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Snowpark is an umbrella term by Snowflake for runtime environments and libraries that allow us to execute non-SQL code like Python, Java, and Scala directly on Snowflake. For simplicity, in the rest of this post, we will focus on Python as a non-SQL language. Within Snowpark, the most important library is the Snowpark API, a classic Dataframe API, which translates Python code directly into SnowSQL, the SQL dialect of Snowpark, to execute it as usual on Snowflake. Essential here are the runtime environments for (vectorized) user-defined (Table) functions (UDxFs) as well as stored procedures (SPROCs) to execute non-SQL code directly in Snowflake.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">How do these three components,<\/span><a href=\"https:\/\/docs.snowflake.com\/en\/developer-guide\/snowpark\/index\"> <span style=\"font-weight: 400;\">Snowpark API<\/span><\/a><span style=\"font-weight: 400;\">,<\/span><a href=\"https:\/\/docs.snowflake.com\/developer-guide\/udf\/udf-overview\"> <span style=\"font-weight: 400;\">UDxFs<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">and<\/span><a href=\"https:\/\/docs.snowflake.com\/en\/developer-guide\/stored-procedure\/stored-procedures-overview\"> <span style=\"font-weight: 400;\">SPROCs<\/span><\/a> <span style=\"font-weight: 400;\">work together, and, most importantly, when should you use which?<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">For <\/span><b>transformations<\/b><span style=\"font-weight: 400;\"> that could also be implemented in SQL, use the <\/span><b>Snowpark API<\/b><span style=\"font-weight: 400;\">. In the same case, you would use PySpark in the Spark world.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Complex operations<\/b><span style=\"font-weight: 400;\"> not representable in SQL and requiring libraries like PyTorch or Scikit-Learn are performed using<\/span><b> UDxFs<\/b><span style=\"font-weight: 400;\">. The same case when you turn to UDFs in the case of Spark.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">For the <\/span><b>orchestration and automation<\/b><span style=\"font-weight: 400;\"> of the above-described transformations and operations, use <\/span><b>SPROCs<\/b><span style=\"font-weight: 400;\">. In the Spark world, the equivalent would be Databricks workflows, which allow setting up a notebook as a job that can be executed at predefined times.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">It is already apparent how similar Snowpark and Spark are from a user&#8217;s perspective. This is advantageous as existing Spark ETL pipelines can often be migrated to Snowpark quite easily.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In addition to the three components of Snowpark already mentioned, there is another library named <\/span><i><span style=\"font-weight: 400;\">Snowpark ML API<\/span><\/i><span style=\"font-weight: 400;\">. This consists of a <\/span><i><span style=\"font-weight: 400;\">Modelling<\/span><\/i><span style=\"font-weight: 400;\"> module, which offers parallelized ML algorithms similar to Spark ML, and an <\/span><i><span style=\"font-weight: 400;\">Operations<\/span><\/i><span style=\"font-weight: 400;\"> module for MLOps tasks. For organizing ML models, there is a Model Registry in the Operations module. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">To add to the complexity of terms under the Snowpark umbrella, <\/span><i><span style=\"font-weight: 400;\">Container Services<\/span><\/i><span style=\"font-weight: 400;\"> also pushes in as another runtime environment. Container Services allow the direct deployment and execution of Docker containers within Snowflake and are used under the hood by<\/span><a href=\"https:\/\/www.inovex.de\/de\/blog\/next-stop-insights-how-streamlit-and-snowflake-power-up-deutsche-bahn-data-adventures\/\"> <span style=\"font-weight: 400;\">Streamlit applications on Snowflake<\/span><\/a><span style=\"font-weight: 400;\">. T<\/span><span style=\"font-weight: 400;\">he following diagram shows all the components mentioned.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-51087 \" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/image1.jpg\" alt=\"\" width=\"1104\" height=\"543\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/image1.jpg 1920w, https:\/\/www.inovex.de\/wp-content\/uploads\/image1-300x148.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/image1-1024x503.jpg 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/image1-768x378.jpg 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/image1-1536x755.jpg 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/image1-400x197.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/image1-360x177.jpg 360w\" sizes=\"auto, (max-width: 1104px) 100vw, 1104px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Although Snowpark, by Snowflake&#8217;s own definition, comprises many components, it is very common to refer to just the three components<\/span><a href=\"https:\/\/docs.snowflake.com\/en\/developer-guide\/snowpark\/index\"> <span style=\"font-weight: 400;\">Snowpark API<\/span><\/a><span style=\"font-weight: 400;\">,<\/span><a href=\"https:\/\/docs.snowflake.com\/developer-guide\/udf\/udf-overview\"> <span style=\"font-weight: 400;\">UDxFs<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">and<\/span><a href=\"https:\/\/docs.snowflake.com\/en\/developer-guide\/stored-procedure\/stored-procedures-overview\"> <span style=\"font-weight: 400;\">SPROCs<\/span><\/a><span style=\"font-weight: 400;\"> as <\/span><i><span style=\"font-weight: 400;\">Snowpark<\/span><\/i><span style=\"font-weight: 400;\">. This also allows a direct comparison between Spark and Snowpark, in the spirit of the word creation S(now)park.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"How-does-Snowpark-differ-from-Spark-under-the-hood\"><\/span><b>How does Snowpark differ from Spark under the hood?<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">So far, it sounds almost as if Snowpark is simply Spark on Snowflake. Why use a whole new library and not just use the Snowflake Connector for Spark?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To understand this, let&#8217;s take a brief deep dive into Spark. Spark is a complete framework for distributed computing, in which the Spark API is just the \u201cuser interface\u201c. For the execution of a Spark query, the code is first converted into a logical plan (Execution Plan) that represents all necessary operations in a graph. The Spark driver uses this logical plan to create a physical plan for each executor, which can be executed on the respective nodes.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The Snowpark API is, so to speak, only the first step of this process: The conversion of non-SQL code into another instruction, which is more understandable for the system. In Spark, this is directly a logical plan, whereas Snowpark performs a trans-piling to SnowSQL. Especially in the preview phase of Snowpark, SQL error messages sometimes surprised users, even though they had defined the query using Dataframes in Python. That has improved a lot over time; error messages are much more meaningful nowadays.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In Snowpark, unlike Spark, there is no distributed computing runtime below the Snowpark API, but our familiar Snowflake with all its advantages. Unlike Spark, there is thus almost no administrative overhead, and the mature and finely-tuned Snowflake engine optimizes our Snowpark query. Thus, there is no need for its tuning of memory, JVM heap space, garbage collection parameters,<\/span><a href=\"https:\/\/spark.apache.org\/docs\/latest\/tuning.html\"> <span style=\"font-weight: 400;\">and much more<\/span><\/a> <span style=\"font-weight: 400;\">as in Spark. Instead, <\/span><i><span style=\"font-weight: 400;\">full focus on the development of the actual application<\/span><\/i><span style=\"font-weight: 400;\">!<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"How-does-Snowpark-differ-from-Spark-in-use\"><\/span><b>How does Snowpark differ from Spark in use?<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"Programming\"><\/span><b>Programming<\/b><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Since the Snowpark Python API has adopted almost 100 % of the PySpark API, Spark users will feel immediately at home with Snowpark. For simple workflows, migration is limited to just swapping the import statements from <code>pyspark<\/code> to <code>snowflake<\/code>, i.e.,<\/span><\/p>\n<pre class=\"lang:python decode:true\">import pyspark\r\nfrom pyspark.sql import SparkSession, SQLContext\r\nfrom pyspark.context import SparkContext\r\nfrom pyspark.sql import functions as F\r\nfrom pyspark.sql import types as T<\/pre>\n<p><span style=\"font-weight: 400;\">becomes<\/span><\/p>\n<pre class=\"lang:python decode:true\">import snowflake\r\nfrom snowflake import Session # No SQLContext or else needed!\r\nfrom snowflake.snowpark import functions as F\r\nfrom snowflake.snowpark import types as T<\/pre>\n<p><span style=\"font-weight: 400;\">However, for a larger codebase, the freely available tool<\/span><a href=\"https:\/\/docs.snowconvert.com\/snowconvert-for-spark\/for-spark-python\/introduction\"> <span style=\"font-weight: 400;\">SnowConvert<\/span><\/a> <span style=\"font-weight: 400;\">is recommended, which automatically makes these changes. SnowConvert also adds appropriate comments at points where there is no direct replacement of PySpark functionality by Snowpark, e.g., for PySpark methods:<\/span><\/p>\n<ul>\n<li><code>DataFrame.coalesce<\/code> <span style=\"font-weight: 400;\">\u2192<\/span> <span style=\"font-weight: 400;\">does not exist, as the processing model is not based directly on partitions like in Spark,<\/span><\/li>\n<li><code>DataFrame.foreach<\/code> <span style=\"font-weight: 400;\">\u2192<\/span> <span style=\"font-weight: 400;\">rephrase as UDF and apply to the really affected columns, not the entire row,<\/span><\/li>\n<li><code>DataFrame.head<\/code> <span style=\"font-weight: 400;\">\u2192<\/span> <code>limit<\/code> <span style=\"font-weight: 400;\">followed by<\/span> <code>collect<\/code>,<\/li>\n<li><code>DataFrame.cache<\/code> <span style=\"font-weight: 400;\">\u2192<\/span> <code>cache_result<\/code>.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Testing-and-Debugging\"><\/span><b>Testing and Debugging<\/b><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">For checking the execution of a query, Spark offers the so-called SparkUI. Since Snowpark translates the query into SnowSQL, you use the usual <\/span><i><span style=\"font-weight: 400;\">Query History<\/span><\/i><span style=\"font-weight: 400;\"> under Snowpark, where you can also view the <\/span><i><span style=\"font-weight: 400;\">Profile Overview<\/span><\/i><span style=\"font-weight: 400;\"> with the Execution Plan. At this point, there are no fundamental differences between Spark to Snowpark; one just needs to get used to another user interface.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Testing is very important for any data pipeline and data product. Here, Spark, especially the open-source version compared to Databricks &amp; Snowpark, has the advantage that tests can also be run locally. Until recently, Snowpark was somewhat (snow-)blind in this area, as the testing code required an internet connection to Snowflake. Fortunately, Snowpark now offers a \u201cLocal Mode\u201c as a public preview feature, which allows<\/span><a href=\"https:\/\/medium.com\/snowflake\/create-and-test-snowpark-dataframes-locally-pupr-de1211958b4b\"> <span style=\"font-weight: 400;\">tests to be run without a connection to Snowflake<\/span><\/a><span style=\"font-weight: 400;\">, e.g., with pytest.<\/span><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Availability-of-Python-packages\"><\/span><b>Availability of Python packages<\/b><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">One of the reasons for using a non-SQL language at all is, of course, the extended functionality and access to a rich ecosystem of packages like Python. With Spark, there are almost no restrictions here, and any third-party packages can be used, whether installed from PyPI or provided directly. Snowpark, as in also in other cases, chooses a different path,<\/span><a href=\"https:\/\/medium.com\/snowflake\/why-anaconda-in-snowpark-64e142c09277\"> <span style=\"font-weight: 400;\">the path of maximum security<\/span><\/a><span style=\"font-weight: 400;\">. By default, only packages from a special<\/span><a href=\"https:\/\/repo.anaconda.com\/pkgs\/snowflake\/\"> <span style=\"font-weight: 400;\">Snowflake Channel at Anaconda<\/span><\/a> <span style=\"font-weight: 400;\">can be installed, which have been previously checked by Snowflake itself for security and thus guaranteed not to contain any malicious code. Currently, more than 2000 Python packages are available on the channel, and more are added daily. This means that the most commonly used Python packages are also available for Snowpark. If not, there is still the<\/span><a href=\"https:\/\/medium.com\/snowflake\/introducing-simple-workflow-for-using-python-packages-in-snowpark-928f667ff1aa\"> <span style=\"font-weight: 400;\">option to access PyPI and other repositories<\/span><\/a> <span style=\"font-weight: 400;\">by loosening the security settings using the <code>session.custom_package_usage_config<\/code><\/span>\u00a0<span style=\"font-weight: 400;\">parameter. This method also allows the provision of owned Python packages. This replaces the slightly older variant where<\/span><a href=\"https:\/\/community.snowflake.com\/s\/article\/how-to-use-other-python-packages-in-snowpark\"> <span style=\"font-weight: 400;\">special Python zip packages had to be created<\/span><\/a><span style=\"font-weight: 400;\">, which were then provided via a stage. However, a disadvantage of Snowpark should not be concealed. So far, only pure Python packages, i.e., without native code components, are supported unless they are found on the Snowflake Anaconda Channel.<\/span><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Loading-from-external-data-sources\"><\/span><b>Loading from external data sources<\/b><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">For many Spark users, the large number of Spark extensions and plugins are of great value. Prominent examples of plugins are Spark connectors for various data sources like Postgres or MongoDB. When using Snowpark, one has to rethink a bit here, as the Snowpark API, as described above, is only a kind of frontend for Snowflake. Thus, the responsibility for<\/span><a href=\"https:\/\/docs.snowflake.com\/en\/user-guide\/data-load-overview\"> <span style=\"font-weight: 400;\">integrating additional data sources<\/span><\/a> <span style=\"font-weight: 400;\">lies directly with Snowflake. External data sources must be made available on cloud storage, known as <\/span><i><span style=\"font-weight: 400;\">staging<\/span><\/i><span style=\"font-weight: 400;\">, and then loaded into Snowflake using<\/span><a href=\"https:\/\/docs.snowflake.com\/en\/user-guide\/data-load-snowpipe-intro\"> <span style=\"font-weight: 400;\">Snowpipe<\/span><\/a><span style=\"font-weight: 400;\">. Additionally, external providers like<\/span><a href=\"https:\/\/www.fivetran.com\/\"><span style=\"font-weight: 400;\"> Fivetran<\/span><\/a><span style=\"font-weight: 400;\"> allow connecting almost 500 external data sources to Snowflake and Snowflake itself also provides<\/span><a href=\"https:\/\/docs.snowflake.com\/en\/user-guide\/connectors\"> <span style=\"font-weight: 400;\">connectors for Kafka and Spark<\/span><\/a><span style=\"font-weight: 400;\">. However, data does not always have to be integrated into Snowflake. A current preview feature of Snowflake is <\/span><a href=\"https:\/\/docs.snowflake.com\/en\/user-guide\/tables-iceberg\"><span style=\"font-weight: 400;\">Iceberg Tables<\/span><\/a><span style=\"font-weight: 400;\">, an<\/span><a href=\"https:\/\/iceberg.apache.org\/\"> <span style=\"font-weight: 400;\">open table format by Apache based on Parquet<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><span style=\"font-weight: 400;\"> This allows Snowflake to be used directly on its data storage for the first time, almost without performance losses. Overall, the connectivity of Snowpark and Spark is certainly similarly powerful but implemented differently.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">We have closely examined Snowpark as an attractive alternative to Spark and highlighted both similarities and differences. In general, migration from Spark to Snowpark is often easy and benefits from the simplified maintenance and data governance of Snowflake.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We are happy to advise you on whether a migration to Snowpark is worthwhile for you and also support you in the implementation. More information about our services around Snowflake and how to contact us can be found <a href=\"https:\/\/www.inovex.de\/de\/leistungen\/data-engineering\/snowflake\/\">here<\/a>.<\/span><\/p>\n<p><span style=\"color: #061b5a; font-size: 40px; font-weight: bold;\">References and useful links<\/span><\/p>\n<ul>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=M7uAWoPKMsg\">PySpark to Snowpark Migration<\/a><\/li>\n<li><a href=\"https:\/\/docs.snowconvert.com\/snowconvert-for-spark\/for-spark-python\/introduction\">SnowConvert<\/a><\/li>\n<li><a href=\"https:\/\/docs.snowflake.com\/en\/developer-guide\/snowpark\/index\">Snowpark API<\/a>, <a href=\"https:\/\/docs.snowflake.com\/developer-guide\/udf\/udf-overview\">UDxFs<\/a> &amp; <a href=\"https:\/\/docs.snowflake.com\/en\/developer-guide\/stored-procedure\/stored-procedures-overview\">SPROCs<\/a><\/li>\n<li><a href=\"https:\/\/www.inovex.de\/de\/blog\/next-stop-insights-how-streamlit-and-snowflake-power-up-deutsche-bahn-data-adventures\/\">Next Stop: Insights! How Streamlit and Snowflake Power Up Deutsche Bahn Data Adventures<\/a><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/docs.snowflake.com\/en\/developer-guide\/snowpark\/python\/testing-locally\"><span style=\"font-weight: 400;\">Snowpark Local Testing Framework<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/medium.com\/snowflake\/create-and-test-snowpark-dataframes-locally-pupr-de1211958b4b\"><span style=\"font-weight: 400;\">Create and Test Snowpark DataFrames Locally<\/span><\/a><span style=\"font-weight: 400;\">\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/medium.com\/snowflake\/why-anaconda-in-snowpark-64e142c09277\"><span style=\"font-weight: 400;\">Why Anaconda in Snowpark<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/repo.anaconda.com\/pkgs\/snowflake\/\"><span style=\"font-weight: 400;\">Anaconda Snowflake Channel<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/medium.com\/snowflake\/introducing-simple-workflow-for-using-python-packages-in-snowpark-928f667ff1aa\"><span style=\"font-weight: 400;\">Simple workflow for using Python Packages in Snowpark<\/span><\/a><span style=\"font-weight: 400;\">\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/docs.snowflake.com\/en\/user-guide\/data-load-overview\"><span style=\"font-weight: 400;\">Snowflake Data Loading<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/docs.snowflake.com\/en\/user-guide\/data-load-snowpipe-intro\"><span style=\"font-weight: 400;\">Snowpipe<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/docs.snowflake.com\/en\/user-guide\/connectors\"><span style=\"font-weight: 400;\">Kafka and Spark Connectors<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/iceberg.apache.org\/\"><span style=\"font-weight: 400;\">Apache Iceberg Open Table Format<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/docs.snowflake.com\/en\/user-guide\/tables-iceberg\"><span style=\"font-weight: 400;\">Snowflake Iceberg Tables<\/span><\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>From previous blog posts, we are now familiar with some basic concepts and features of Snowflake. In this post, we want to focus on a feature that will be of interest to those who already operate a data warehouse in Databricks, or with Apache Spark: Snowpark. Before diving into the topic, this article will first [&hellip;]<\/p>\n","protected":false},"author":372,"featured_media":52472,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[511,77,181,71,733,385,1127,179,206,784,79,1108,105],"service":[446,414,411,431],"coauthors":[{"id":372,"display_name":"Jannik Bach","user_nicename":"jbach"},{"id":52,"display_name":"Florian Wilhelm","user_nicename":"fwilhelm"}],"class_list":["post-51086","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-artificial-intelligence-2","tag-big-data","tag-business-intelligence","tag-cloud","tag-cloud-en-2","tag-data-engineering","tag-data-mesh","tag-data-products","tag-data-science","tag-databricks","tag-replatforming","tag-snowflake","tag-spark","service-business-intelligence","service-cloud","service-data-engineering","service-data-science"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Snowpark for Spark Users: What You Need to Know - inovex GmbH<\/title>\n<meta name=\"description\" content=\"In this post, we want to focus on a feature that will be of interest to those who already operate a data warehouse in Databricks, or with Apache Spark: Snowpark.\" \/>\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.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Snowpark for Spark Users: What You Need to Know - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"In this post, we want to focus on a feature that will be of interest to those who already operate a data warehouse in Databricks, or with Apache Spark: Snowpark.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-21T09:40:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-21T09:46:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/snowpark_VS_apache_spark_v2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1500\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jannik Bach, Florian Wilhelm\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/snowpark_VS_apache_spark_v2-1024x601.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jannik Bach\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"8\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Jannik Bach, Florian Wilhelm\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/\"},\"author\":{\"name\":\"Jannik Bach\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/61ae43c3c48ae86748bf04168d590be7\"},\"headline\":\"Snowpark for Spark Users: What You Need to Know\",\"datePublished\":\"2024-03-21T09:40:20+00:00\",\"dateModified\":\"2024-03-21T09:46:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/\"},\"wordCount\":1556,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/snowpark_VS_apache_spark_v2.png\",\"keywords\":[\"Artificial Intelligence\",\"Big Data\",\"Business Intelligence\",\"Cloud\",\"Cloud\",\"Data Engineering\",\"Data Mesh\",\"Data Products\",\"Data Science\",\"Databricks\",\"Replatforming\",\"Snowflake\",\"Spark\"],\"articleSection\":[\"Analytics\",\"Applications\",\"Infrastructure\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/\",\"name\":\"Snowpark for Spark Users: What You Need to Know - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/snowpark_VS_apache_spark_v2.png\",\"datePublished\":\"2024-03-21T09:40:20+00:00\",\"dateModified\":\"2024-03-21T09:46:08+00:00\",\"description\":\"In this post, we want to focus on a feature that will be of interest to those who already operate a data warehouse in Databricks, or with Apache Spark: Snowpark.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/snowpark_VS_apache_spark_v2.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/snowpark_VS_apache_spark_v2.png\",\"width\":1500,\"height\":880,\"caption\":\"Apache Spark vs. Snowpark Logos gegen\u00fcber und durch eine Mauer abgegerenzt. Mensch schaut von der Apache Spark Seite r\u00fcber zur Snowpark Seite\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/snowpark-for-spark-users-what-you-need-to-know\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Snowpark for Spark Users: What You Need to Know\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/61ae43c3c48ae86748bf04168d590be7\",\"name\":\"Jannik Bach\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe4403dd9b63f08ada4d410a057108f2c8c9563bc440d3ef12260ec11d5838ea?s=96&d=retro&r=gf0561d9f701ec631f0cdc19778867453\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe4403dd9b63f08ada4d410a057108f2c8c9563bc440d3ef12260ec11d5838ea?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe4403dd9b63f08ada4d410a057108f2c8c9563bc440d3ef12260ec11d5838ea?s=96&d=retro&r=g\",\"caption\":\"Jannik Bach\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/jbach\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Snowpark for Spark Users: What You Need to Know - inovex GmbH","description":"In this post, we want to focus on a feature that will be of interest to those who already operate a data warehouse in Databricks, or with Apache Spark: Snowpark.","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.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/","og_locale":"de_DE","og_type":"article","og_title":"Snowpark for Spark Users: What You Need to Know - inovex GmbH","og_description":"In this post, we want to focus on a feature that will be of interest to those who already operate a data warehouse in Databricks, or with Apache Spark: Snowpark.","og_url":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2024-03-21T09:40:20+00:00","article_modified_time":"2024-03-21T09:46:08+00:00","og_image":[{"width":1500,"height":880,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/snowpark_VS_apache_spark_v2.png","type":"image\/png"}],"author":"Jannik Bach, Florian Wilhelm","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/snowpark_VS_apache_spark_v2-1024x601.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Jannik Bach","Gesch\u00e4tzte Lesezeit":"8\u00a0Minuten","Written by":"Jannik Bach, Florian Wilhelm"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/"},"author":{"name":"Jannik Bach","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/61ae43c3c48ae86748bf04168d590be7"},"headline":"Snowpark for Spark Users: What You Need to Know","datePublished":"2024-03-21T09:40:20+00:00","dateModified":"2024-03-21T09:46:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/"},"wordCount":1556,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/snowpark_VS_apache_spark_v2.png","keywords":["Artificial Intelligence","Big Data","Business Intelligence","Cloud","Cloud","Data Engineering","Data Mesh","Data Products","Data Science","Databricks","Replatforming","Snowflake","Spark"],"articleSection":["Analytics","Applications","Infrastructure"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/","url":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/","name":"Snowpark for Spark Users: What You Need to Know - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/snowpark_VS_apache_spark_v2.png","datePublished":"2024-03-21T09:40:20+00:00","dateModified":"2024-03-21T09:46:08+00:00","description":"In this post, we want to focus on a feature that will be of interest to those who already operate a data warehouse in Databricks, or with Apache Spark: Snowpark.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/snowpark_VS_apache_spark_v2.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/snowpark_VS_apache_spark_v2.png","width":1500,"height":880,"caption":"Apache Spark vs. Snowpark Logos gegen\u00fcber und durch eine Mauer abgegerenzt. Mensch schaut von der Apache Spark Seite r\u00fcber zur Snowpark Seite"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/snowpark-for-spark-users-what-you-need-to-know\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Snowpark for Spark Users: What You Need to Know"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/61ae43c3c48ae86748bf04168d590be7","name":"Jannik Bach","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/fe4403dd9b63f08ada4d410a057108f2c8c9563bc440d3ef12260ec11d5838ea?s=96&d=retro&r=gf0561d9f701ec631f0cdc19778867453","url":"https:\/\/secure.gravatar.com\/avatar\/fe4403dd9b63f08ada4d410a057108f2c8c9563bc440d3ef12260ec11d5838ea?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fe4403dd9b63f08ada4d410a057108f2c8c9563bc440d3ef12260ec11d5838ea?s=96&d=retro&r=g","caption":"Jannik Bach"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/jbach\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/51086","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/372"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=51086"}],"version-history":[{"count":6,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/51086\/revisions"}],"predecessor-version":[{"id":52477,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/51086\/revisions\/52477"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/52472"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=51086"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=51086"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=51086"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=51086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}