<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Palak Mazumdar</title>
    <description>The latest articles on DEV Community by Palak Mazumdar (@palak_mazumdar_f5431445f6).</description>
    <link>https://dev.to/palak_mazumdar_f5431445f6</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4049120%2F2a8608e9-f2ac-4681-af0d-0f3c08292bc9.jpg</url>
      <title>DEV Community: Palak Mazumdar</title>
      <link>https://dev.to/palak_mazumdar_f5431445f6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/palak_mazumdar_f5431445f6"/>
    <language>en</language>
    <item>
      <title>CDP-6001 in PySpark: Six Code Blocks Behind 58% of the Cloudera ML Engineer Exam</title>
      <dc:creator>Palak Mazumdar</dc:creator>
      <pubDate>Fri, 16 Oct 2026 02:58:35 +0000</pubDate>
      <link>https://dev.to/palak_mazumdar_f5431445f6/cdp-6001-in-pyspark-six-code-blocks-behind-58-of-the-cloudera-ml-engineer-exam-30f0</link>
      <guid>https://dev.to/palak_mazumdar_f5431445f6/cdp-6001-in-pyspark-six-code-blocks-behind-58-of-the-cloudera-ml-engineer-exam-30f0</guid>
      <description>&lt;p&gt;CDP-6001, Cloudera's Machine Learning Engineer exam, gives you 45 questions in 90 minutes and needs 60% to pass. Three of its five domains (Spark 18%, Spark MLlib 22% and Deploying a Machine Learning Model 18%) add up to 58% of the exam, and all three are code you can run yourself in a Cloudera Machine Learning session.&lt;/p&gt;

&lt;p&gt;This post walks through that code as one small churn project: load events, build window features, fit a pipeline, tune it, track the run with MLflow and deploy a scoring function. Each block maps to a line of the official topic list.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the CDP-6001 exam measure?
&lt;/h2&gt;

&lt;p&gt;Cloudera lists five domains and a weight for each. The exam costs $330, is taken online with a proctor, and allows no reference material at all, so you cannot look up an API while you answer.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;Topics listed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudera Machine Learning&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;Workspaces, Projects, Experiments, Accelerators for ML Projects, Data Visualizations, Runtimes, GPUs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spark MLlib&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;Model Selection and Tuning, Fitting and Evaluating Models, Pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spark&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;td&gt;DataFrames, File Types, Window Functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deploying a Machine Learning Model&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;td&gt;Applications/API, Autoscaling and Performance, Model Metrics and Monitoring, ML Flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deep Learning and General Machine Learning&lt;/td&gt;
&lt;td&gt;11%&lt;/td&gt;
&lt;td&gt;General Machine Learning, Supervised and unsupervised learning, Algorithms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The weights above are copied from the &lt;a href="https://www.cloudera.com/services-and-support/training/certification/cdp-machine-learning-engineer.html" rel="noopener noreferrer"&gt;CDP Machine Learning Engineer exam guide&lt;/a&gt;, which also names the suggested course, Predicting with Cloudera Machine Learning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjxqazxzuen0gquaqnpja.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjxqazxzuen0gquaqnpja.png" alt="CDP-6001 infographic: 45 questions split by domain weight, and the ML workflow from data to deployed model mapped to each exam domain" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How fast do you need to answer?
&lt;/h2&gt;

&lt;p&gt;Ninety minutes for 45 questions is two minutes a question. If every question counts the same, 60% of 45 is 27 correct answers, so you can miss 18. Cloudera publishes the pass score only as a percentage, so treat 27 as arithmetic, not a rule.&lt;/p&gt;

&lt;p&gt;Two minutes is enough to read a short code snippet and spot the wrong argument, but not enough to work out an API from scratch. That is why writing the code below once, by hand, pays off. This short from the AnalyticsExam channel covers the same pacing:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/HdjUsewubK8" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Which file and DataFrame skills does the Spark domain test?
&lt;/h2&gt;

&lt;p&gt;The Spark domain names DataFrames and File Types. The pattern to know: read raw CSV with an explicit schema, write it once as partitioned Parquet, and read the Parquet copy from then on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.sql&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SparkSession&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;functions&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;

&lt;span class="n"&gt;spark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SparkSession&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cdp6001-churn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;getOrCreate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/churn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# point this at storage your Spark executors can read
&lt;/span&gt;
&lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StructType&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StructField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StringType&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StructField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_ts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TimestampType&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StructField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StringType&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StructField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monthly_spend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DoubleType&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StructField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support_tickets&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IntegerType&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StructField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;churned&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IntegerType&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;header&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/events.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_ts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;overwrite&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;partitionBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parquet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/events_parquet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parquet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/events_parquet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;printSchema&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three details tend to come up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An explicit schema saves the extra pass over the file that &lt;code&gt;inferSchema&lt;/code&gt; needs, and it stops a column of IDs from turning into integers.&lt;/li&gt;
&lt;li&gt;Parquet stores the schema with the data and is columnar, so a query that reads three columns does not scan the other ten.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;partitionBy("event_date")&lt;/code&gt; writes one folder per date, and a filter on &lt;code&gt;event_date&lt;/code&gt; can skip whole folders.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do window functions turn events into features?
&lt;/h2&gt;

&lt;p&gt;Window functions are the third Spark topic, and they are how raw events become one row of features per customer. A window has a partition, an order and, for running totals, a frame.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.sql&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;

&lt;span class="n"&gt;w_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;partitionBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_ts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;w_last7&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;w_time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rowsBetween&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currentRow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;w_latest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;partitionBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_ts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prev_spend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monthly_spend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;over&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w_time&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spend_change&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monthly_spend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prev_spend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tickets_last7_events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support_tickets&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;over&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w_last7&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;row_number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;over&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w_latest&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rn = 1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prev_spend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spend_change&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;lag&lt;/code&gt; returns null on the first row of every partition, which is why &lt;code&gt;fillna&lt;/code&gt; follows it. &lt;code&gt;rowsBetween(-6, 0)&lt;/code&gt; counts rows, so the sum covers the last seven events, not the last seven days; a time-based frame needs &lt;code&gt;rangeBetween&lt;/code&gt; over a numeric ordering column. The Spark SQL reference on &lt;a href="https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-window.html" rel="noopener noreferrer"&gt;window functions and frame clauses&lt;/a&gt; lists the ranking functions (&lt;code&gt;ROW_NUMBER&lt;/code&gt;, &lt;code&gt;RANK&lt;/code&gt;, &lt;code&gt;DENSE_RANK&lt;/code&gt;, &lt;code&gt;NTILE&lt;/code&gt;, &lt;code&gt;PERCENT_RANK&lt;/code&gt;) and the analytic ones (&lt;code&gt;LAG&lt;/code&gt;, &lt;code&gt;LEAD&lt;/code&gt;, &lt;code&gt;FIRST_VALUE&lt;/code&gt; and others).&lt;/p&gt;

&lt;h2&gt;
  
  
  What does a Spark MLlib pipeline look like end to end?
&lt;/h2&gt;

&lt;p&gt;Pipelines are one of the three MLlib topics, and the exam's tuning questions build on them. A pipeline chains stages; Estimators get &lt;code&gt;fit()&lt;/code&gt;, Transformers get &lt;code&gt;transform()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.ml&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Pipeline&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.ml.feature&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StringIndexer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OneHotEncoder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VectorAssembler&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.ml.classification&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LogisticRegression&lt;/span&gt;

&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomSplit&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;indexer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StringIndexer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputCol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outputCol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plan_idx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handleInvalid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keep&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OneHotEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputCols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plan_idx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;outputCols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plan_vec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;assembler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;VectorAssembler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;inputCols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plan_vec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monthly_spend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spend_change&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tickets_last7_events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;outputCol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;features&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;lr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LogisticRegression&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;featuresCol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;features&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelCol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;churned&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;indexer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;assembler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# a PipelineModel
&lt;/span&gt;&lt;span class="n"&gt;scored&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# adds rawPrediction, probability, prediction
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;StringIndexer&lt;/code&gt;, &lt;code&gt;OneHotEncoder&lt;/code&gt; and &lt;code&gt;LogisticRegression&lt;/code&gt; are Estimators here; &lt;code&gt;VectorAssembler&lt;/code&gt; is a Transformer. After &lt;code&gt;fit()&lt;/code&gt;, every Estimator in the chain has become a fitted Transformer inside the &lt;code&gt;PipelineModel&lt;/code&gt;, so training and test data go through exactly the same steps. The Spark guide to &lt;a href="https://spark.apache.org/docs/latest/ml-pipeline.html" rel="noopener noreferrer"&gt;ML Pipelines, Estimators and Transformers&lt;/a&gt; has the diagram worth remembering for this part.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do CrossValidator and TrainValidationSplit differ?
&lt;/h2&gt;

&lt;p&gt;Model Selection and Tuning is where a counting question is easy to set: how many models does this code fit?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.ml.tuning&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ParamGridBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CrossValidator&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.ml.evaluation&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BinaryClassificationEvaluator&lt;/span&gt;

&lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ParamGridBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addGrid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;regParam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addGrid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;elasticNetParam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                                    &lt;span class="c1"&gt;# 3 x 2 = 6 settings
&lt;/span&gt;
&lt;span class="n"&gt;evaluator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BinaryClassificationEvaluator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labelCol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;churned&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# default metric: areaUnderROC
&lt;/span&gt;
&lt;span class="n"&gt;cv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CrossValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estimator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;estimatorParamMaps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numFolds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parallelism&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cv_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;test_auc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cv_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;best_lr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bestModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_auc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;best_lr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRegParam&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;best_lr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElasticNetParam&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six settings times three folds is 18 fits, and CrossValidator then re-fits the best setting on the whole training set, so 19 in total. &lt;code&gt;TrainValidationSplit&lt;/code&gt; evaluates each setting once on a single split set by &lt;code&gt;trainRatio&lt;/code&gt;, so the same grid costs 6 fits plus the final one. &lt;code&gt;parallelism=2&lt;/code&gt; evaluates two settings at a time; it changes the run time, not the result.&lt;/p&gt;

&lt;p&gt;Because the estimator is the whole pipeline, the encoder and indexer are re-fitted inside every fold too, which keeps test-fold data out of training. The Spark page on &lt;a href="https://spark.apache.org/docs/latest/ml-tuning.html" rel="noopener noreferrer"&gt;model selection and hyperparameter tuning&lt;/a&gt; also lists the three evaluators: regression, binary classification and multiclass.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you track runs with MLflow in Cloudera Machine Learning?
&lt;/h2&gt;

&lt;p&gt;ML Flow sits under the deployment domain. In Cloudera Machine Learning an experiment run is ordinary MLflow code inside a project session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;mlflow&lt;/span&gt;

&lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_experiment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cdp6001-churn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;numFolds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;best_regParam&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;best_lr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRegParam&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;best_elasticNetParam&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;best_lr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElasticNetParam&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log_metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test_auc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_auc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Points from Cloudera's page on &lt;a href="https://docs.cloudera.com/machine-learning/cloud/experiments/topics/ml-exp-v2-run-exp-mlflow.html" rel="noopener noreferrer"&gt;running an experiment with MLflow&lt;/a&gt; that make good exam questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Experiment runs need a session on ML Runtimes; a Legacy Engine session cannot create them.&lt;/li&gt;
&lt;li&gt;The MLflow client is installed by default, but you import it in every session.&lt;/li&gt;
&lt;li&gt;Run artifacts are stored in the project under &lt;code&gt;.experiments/&amp;lt;experiment_id&amp;gt;/&amp;lt;run_id&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mlflow.autolog()&lt;/code&gt; before the training code logs parameters, metrics and models without explicit calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How does a model become a REST endpoint?
&lt;/h2&gt;

&lt;p&gt;Applications/API and Autoscaling and Performance are about Cloudera's model serving. A model is a Python function in a project file; Cloudera builds it into a container and puts a REST endpoint in front of it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# predict.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cml.models_v1&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;joblib&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;joblib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;churn_model.joblib&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# module level: loaded once when the replica starts
&lt;/span&gt;&lt;span class="n"&gt;FEATURES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monthly_spend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spend_change&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tickets_last7_events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nd"&gt;@models.cml_model&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;missing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;FEATURES&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;missing fields&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fields&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;FEATURES&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;churn_probability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict_proba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this sketch the endpoint serves a small scikit-learn model trained on the same three features, since a Spark &lt;code&gt;PipelineModel&lt;/code&gt; needs a Spark session to score. Test it in the session first with &lt;code&gt;predict({"monthly_spend": 42.5, "spend_change": -8.0, "tickets_last7_events": 3})&lt;/code&gt;, then go to Models, New Model, and enter &lt;code&gt;predict.py&lt;/code&gt; as the file, &lt;code&gt;predict&lt;/code&gt; as the function and the same JSON as the example input. Cloudera's walkthrough on &lt;a href="https://docs.cloudera.com/machine-learning/cloud/models/topics/ml-creating-and-deploying-a-model.html" rel="noopener noreferrer"&gt;creating and deploying a model&lt;/a&gt; adds the replica settings: the default maximum is 9 replicas per deployment, and an administrator can raise it to 199.&lt;/p&gt;

&lt;p&gt;The serving rules behind the autoscaling questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every model function takes one JSON object and returns one JSON object.&lt;/li&gt;
&lt;li&gt;A replica handles one request at a time; extra requests wait in a queue.&lt;/li&gt;
&lt;li&gt;If no replica frees up within 30 seconds, the call fails with &lt;code&gt;model.busy&lt;/code&gt; and HTTP 429, and the fix is more replicas.&lt;/li&gt;
&lt;li&gt;Callers need the model's access key and, with authentication on (the default), their own model API key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Size limits matter too. The page on &lt;a href="https://docs.cloudera.com/machine-learning/cloud/models/topics/ml-calling-a-model.html" rel="noopener noreferrer"&gt;model request and response formats&lt;/a&gt; says requests should stay under 5 MB, dates should travel as ISO-8601 strings, and images or video should be passed by URL rather than inline.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about the 42% that is not code?
&lt;/h2&gt;

&lt;p&gt;The Cloudera Machine Learning domain (31%) is the platform itself: workspaces, projects, experiments, Accelerators for ML Projects (AMPs), Data Visualizations, Runtimes and GPUs. The fastest preparation is to do each once: create a project, start a session on an ML Runtime, pick a GPU resource profile if your workspace has one, launch an AMP, and build one dashboard in Data Visualization.&lt;/p&gt;

&lt;p&gt;The last 11% is general machine learning: supervised versus unsupervised learning and the common algorithms. If you can say why the churn model above is supervised and when you would reach for clustering instead, you have the level of that domain.&lt;/p&gt;

&lt;p&gt;To check yourself against the full topic list, the &lt;a href="https://www.analyticsexam.com/cloudera/cloudera-cdp-6001-certification-exam-syllabus" rel="noopener noreferrer"&gt;CDP-6001 syllabus and practice exam page&lt;/a&gt; repeats the five weights with sample questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. How many questions are on the CDP-6001 exam?
&lt;/h3&gt;

&lt;p&gt;CDP-6001 has 45 questions in 90 minutes, with a pass score of 60%. It costs $330 and is taken online with a proctor.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Can I use documentation during the CDP-6001 exam?
&lt;/h3&gt;

&lt;p&gt;No. Cloudera allows no resources: no reference material, white papers, user guides or anything else during the exam.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Which Spark skills does CDP-6001 test?
&lt;/h3&gt;

&lt;p&gt;The Spark domain (18%) covers DataFrames, file types and window functions. The Spark MLlib domain (22%) covers model selection and tuning, fitting and evaluating models, and pipelines.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Does CDP-6001 cover MLflow?
&lt;/h3&gt;

&lt;p&gt;Yes. ML Flow is listed under Deploying a Machine Learning Model (18%), next to Applications/API, Autoscaling and Performance, and Model Metrics and Monitoring.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. How many questions can I miss on CDP-6001?
&lt;/h3&gt;

&lt;p&gt;If every question counts the same, 27 correct answers out of 45 reach 60%, which leaves room for 18 misses. Cloudera publishes the pass mark only as a percentage.&lt;/p&gt;

&lt;p&gt;Written by the team behind AnalyticsExam.&lt;/p&gt;

</description>
      <category>cloudera</category>
      <category>pyspark</category>
      <category>machinelearning</category>
      <category>mlops</category>
    </item>
    <item>
      <title>Qlik QSSA Exam: Why Installation and Configuration Add Up to the 62% Pass Mark</title>
      <dc:creator>Palak Mazumdar</dc:creator>
      <pubDate>Thu, 15 Oct 2026 05:09:16 +0000</pubDate>
      <link>https://dev.to/palak_mazumdar_f5431445f6/qlik-qssa-exam-why-installation-and-configuration-add-up-to-the-62-pass-mark-57dk</link>
      <guid>https://dev.to/palak_mazumdar_f5431445f6/qlik-qssa-exam-why-installation-and-configuration-add-up-to-the-62-pass-mark-57dk</guid>
      <description>&lt;p&gt;The Qlik Sense System Administrator (QSSA) exam has 50 questions, a 90-minute limit and a 62% passing score. Its two biggest domains, Installation at 30% and Configuration at 32%, add up to exactly 62%, so the pass line sits right where those two domains end.&lt;/p&gt;

&lt;p&gt;That one fact shapes how you should study. This post works through what it means in questions, minutes and attempts, using the figures on &lt;a href="https://learning.qlik.com/student/activity/2161425-qlik-sense-system-administrator-certification" rel="noopener noreferrer"&gt;Qlik's QSSA exam details page&lt;/a&gt;, checked on 15 October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the Qlik QSSA exam cover?
&lt;/h2&gt;

&lt;p&gt;The exam tests whether you can plan, install, run and fix a client-managed Qlik Sense Enterprise on Windows site. Qlik splits it into four domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Installation (30%):&lt;/strong&gt; planning the infrastructure, installing Qlik Sense Enterprise on Windows with Shared Persistence, and choosing between single-node and multi-node setups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration (32%):&lt;/strong&gt; streams and apps, automated tasks with triggers, load balancing rules, Active Directory connections with user and group sync, and node settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security and Licensing (16%):&lt;/strong&gt; the Qlik Sense licensing model, user license access, and security rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor, Troubleshoot, and Maintenance (22%):&lt;/strong&gt; app issues, system issues and server maintenance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qlik states plainly that the exam covers only the client-managed edition. Nothing on it tests Qlik Cloud administration.&lt;/p&gt;

&lt;h2&gt;
  
  
  How many questions does each domain carry?
&lt;/h2&gt;

&lt;p&gt;Qlik publishes percentages, not question counts. Applying the weights to 50 questions gives a rough split (our arithmetic, not Qlik's):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installation: about 15 questions&lt;/li&gt;
&lt;li&gt;Configuration: about 16 questions&lt;/li&gt;
&lt;li&gt;Security and Licensing: about 8 questions&lt;/li&gt;
&lt;li&gt;Monitor, Troubleshoot, and Maintenance: about 11 questions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At 62%, a pass means about 31 correct answers. Installation and Configuration together come to about 31 questions as well. That is the coincidence in the title, and it is worth reading carefully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you pass on Installation and Configuration alone?
&lt;/h2&gt;

&lt;p&gt;In theory, yes, but only with a perfect score on both, and nobody should plan for that. The real lesson runs the other way: the 19 questions in the two smaller domains are your safety margin.&lt;/p&gt;

&lt;p&gt;At the published mark you can get about 19 questions wrong and still pass. If you treat Security and Licensing as a weak spot and miss most of its 8 questions, you have spent a big part of that margin before the clock reaches the halfway point. Qlik also says the passing score "is adjusted to maintain a consistent standard", so treat 31 as a guide and not a promise.&lt;/p&gt;

&lt;p&gt;A sensible target is to aim for strong scores in all four domains, with Configuration first, because it is the largest single block.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhu2odtvsk531h12jk2do.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhu2odtvsk531h12jk2do.png" alt="Portrait infographic: a column of 50 question slots split into Installation about 15, Configuration about 16, Security and Licensing about 8 and Monitor and Troubleshoot about 11, with the 62 percent pass line after slot 31, followed by the three-attempt retake ladder with 48-hour and 14-day waits and a two-year validity bar" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How much time do you get per question?
&lt;/h2&gt;

&lt;p&gt;Ninety minutes across 50 questions is 1.8 minutes, or 108 seconds, per question. That is enough time to read a scenario twice, but not enough to reason out a load balancing rule or a security rule from first principles.&lt;/p&gt;

&lt;p&gt;A practical pace plan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take a first pass at about 90 seconds per question and flag anything that needs more thought.&lt;/li&gt;
&lt;li&gt;Bank the spare time, roughly 15 minutes, for flagged items.&lt;/li&gt;
&lt;li&gt;Leave nothing blank. An unanswered question can only count as wrong, while a guess might be right.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What experience does Qlik expect before you sit it?
&lt;/h2&gt;

&lt;p&gt;Qlik recommends at least six months as an administrator of a Microsoft Windows Server environment. It also lists hands-on work in the Qlik Management Console (QMC): governance, library maintenance, user and app security, server policies, rules and streams.&lt;/p&gt;

&lt;p&gt;The less obvious part is the tool list. Qlik names Event Viewer, the Services Console, the DCOM Console and the Windows Registry, plus NSLookUp, Telnet, Ping, NetStat, Fiddler and browser developer tools. Those tools point to the troubleshooting questions in the 22% domain. If you have never traced a proxy or certificate problem with them, that is the gap to close.&lt;/p&gt;

&lt;p&gt;For a different view of the exam's scope, the Tier 1 article on &lt;a href="https://www.linkedin.com/pulse/qssa-qlik-exam-excludes-cloud-palak-mazumdar-zklwf/" rel="noopener noreferrer"&gt;why the QSSA leaves Qlik Cloud out&lt;/a&gt; explains which skills the client-managed focus rules in and out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which installation steps should you know by heart?
&lt;/h2&gt;

&lt;p&gt;The Installation domain asks about single-node and multi-node deployments. For multi-node sites, Qlik's help sets out a fixed order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check the pre-installation items: system requirements, supported browsers, ports and licenses.&lt;/li&gt;
&lt;li&gt;Prepare the Windows server.&lt;/li&gt;
&lt;li&gt;Install Qlik Sense on the central node.&lt;/li&gt;
&lt;li&gt;Configure PostgreSQL multi-node connections on the central node.&lt;/li&gt;
&lt;li&gt;License Qlik Sense on the central node.&lt;/li&gt;
&lt;li&gt;Allocate access to users.&lt;/li&gt;
&lt;li&gt;Install the rim nodes.&lt;/li&gt;
&lt;li&gt;Connect and configure the rim nodes in the QMC.&lt;/li&gt;
&lt;li&gt;Optionally, set a failover candidate for the central node.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Questions often hinge on what has to happen before what. You can walk the same sequence step by step in &lt;a href="https://help.qlik.com/en-US/sense-admin/May2026/Subsystems/DeployAdministerQSE/Content/Sense_DeployAdminister/QSEoW/Deploy_QSEoW/Installing-Qlik-Sense-multi-node.htm" rel="noopener noreferrer"&gt;Qlik's guide to installing Qlik Sense in a multi-node site&lt;/a&gt;, which was last updated in October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens if you fail the QSSA exam?
&lt;/h2&gt;

&lt;p&gt;Qlik allows three attempts per exam, and each attempt needs a full payment or a new voucher. The waiting periods are fixed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After a first fail, you wait 48 hours.&lt;/li&gt;
&lt;li&gt;After a second fail, you wait 14 calendar days before the third and final attempt.&lt;/li&gt;
&lt;li&gt;After a third fail, you cannot register for that exam again until Qlik releases a new version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the quickest path through all three attempts runs from day 0 to day 2 to day 16. Qlik enforces the waits and will not let you book an earlier date. All of this is set out in &lt;a href="https://learning.qlik.com/student/activity/1562307-certificates-and-badges" rel="noopener noreferrer"&gt;Qlik Learning's certificates and badges FAQ&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The third-attempt block is the rule to respect. Two fails should send you back to the training and practice work, not straight to a rebooking.&lt;/p&gt;

&lt;h2&gt;
  
  
  How long does the QSSA certification last?
&lt;/h2&gt;

&lt;p&gt;Your result appears as soon as you finish, and Qlik sends it by email too. After a pass, Credly sends a badge invitation within 24 to 48 hours. Qlik no longer issues certificates; the badge in Credly and in your Qlik Learning history is the record.&lt;/p&gt;

&lt;p&gt;The certification is valid for two years from the date you pass. Credly emails you six months before it expires, which is month 18. To keep it, you register for the current exam before the expiry date and pass it. Qlik usually updates its exams every three years, sooner after a major product change.&lt;/p&gt;

&lt;h2&gt;
  
  
  How should you prepare in the time you have?
&lt;/h2&gt;

&lt;p&gt;A plan that follows the weights:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build a lab first.&lt;/strong&gt; A single-node Qlik Sense Enterprise on Windows install teaches more of the 30% Installation domain than any reading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spend the most hours on Configuration.&lt;/strong&gt; Create streams, tasks with triggers, load balancing rules and an AD user sync until you can do them without notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn security rules and license allocation properly.&lt;/strong&gt; Eight questions is a small block, but missing most of it eats your margin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practise troubleshooting with the Windows tools Qlik lists.&lt;/strong&gt; Break your lab on purpose and fix it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check yourself under time pressure.&lt;/strong&gt; The &lt;a href="https://www.analyticsexam.com/qlik/qssa-qlik-sense-system-administrator" rel="noopener noreferrer"&gt;QSSA practice exam on AnalyticsExam&lt;/a&gt; runs timed sets so you can test the 108-second pace.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you already run a Qlik Sense Enterprise site at work, you can shorten step 1, but keep the other four.&lt;/p&gt;

&lt;p&gt;Before your first study session, the three-minute AnalyticsExam video on how to study for the QSSA exam gives a short overview of the preparation steps. It was recorded for the QSSA2022 version, so check the domain weights above against it.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/hUkFYRUiER8" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. How many questions are on the Qlik QSSA exam?
&lt;/h3&gt;

&lt;p&gt;The exam has 50 questions and a 90-minute time limit. Qlik notes that the number and difficulty of questions may change when the exam is updated.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. What score do you need to pass QSSA?
&lt;/h3&gt;

&lt;p&gt;Qlik lists a passing score of 62%, which works out to about 31 correct answers out of 50. Qlik adjusts the passing score to keep a consistent standard, so treat 31 as a guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Does the QSSA exam cover Qlik Cloud?
&lt;/h3&gt;

&lt;p&gt;No. The exam covers only the client-managed edition of Qlik Sense, meaning Qlik Sense Enterprise on Windows. It does not test Qlik Cloud administration.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. How many times can you retake the QSSA exam?
&lt;/h3&gt;

&lt;p&gt;You get three attempts, each paid in full or with a new voucher. You wait 48 hours after the first fail and 14 calendar days after the second. After a third fail, you must wait for a new version of the exam.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. How long is the Qlik Sense System Administrator certification valid?
&lt;/h3&gt;

&lt;p&gt;It is valid for two years from the date you pass. Credly sends a reminder six months before expiry, and you renew by passing the current exam before that date.&lt;/p&gt;

</description>
      <category>qlik</category>
      <category>qliksense</category>
      <category>certification</category>
      <category>learning</category>
    </item>
    <item>
      <title>ISTQB CT-PT in Code: The Load Profile, Throughput Math and Script Behind Half the Exam</title>
      <dc:creator>Palak Mazumdar</dc:creator>
      <pubDate>Wed, 14 Oct 2026 02:39:11 +0000</pubDate>
      <link>https://dev.to/palak_mazumdar_f5431445f6/istqb-ct-pt-in-code-the-load-profile-throughput-math-and-script-behind-half-the-exam-146h</link>
      <guid>https://dev.to/palak_mazumdar_f5431445f6/istqb-ct-pt-in-code-the-load-profile-throughput-math-and-script-behind-half-the-exam-146h</guid>
      <description>&lt;p&gt;The ISTQB Performance Testing exam (CT-PT) asks 40 questions in 90 minutes, and 20 of them come from one chapter of the syllabus: Performance Testing Tasks. You pass with 26 points out of 40. So the best use of your study time is to work that chapter once with your own hands: write an operational profile, turn it into a load profile, do the throughput arithmetic, and put the result in a script.&lt;/p&gt;

&lt;p&gt;This post does that with one small example. The scripts use k6 because it is free and reads like plain JavaScript. The syllabus names no tool at all, so treat the code as a way to make the ideas concrete, not as exam content.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the CT-PT exam look like?
&lt;/h2&gt;

&lt;p&gt;CT-PT is a 40-question multiple-choice exam in ISTQB's Specialist stream, and you need the Foundation Level certificate before you can sit it. The figures below are from the &lt;a href="https://istqb.org/certifications/certified-tester-performance-testing-ct-pt/" rel="noopener noreferrer"&gt;ISTQB page for Certified Tester Performance Testing&lt;/a&gt;, read on 14 October 2026.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Questions&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Points&lt;/td&gt;
&lt;td&gt;40, one per question&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Passing score&lt;/td&gt;
&lt;td&gt;26 points (65%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time&lt;/td&gt;
&lt;td&gt;90 minutes, or 113 if the exam is not in your native language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prerequisite&lt;/td&gt;
&lt;td&gt;Certified Tester Foundation Level (CTFL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Syllabus&lt;/td&gt;
&lt;td&gt;v1.0, released in 2018&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fee&lt;/td&gt;
&lt;td&gt;Not listed by ISTQB. The exam provider you book with sets it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where do the 40 questions come from?
&lt;/h2&gt;

&lt;p&gt;Half of them come from chapter 4. ISTQB publishes the split per chapter in its &lt;a href="https://istqb.org/wp-content/uploads/2026/08/ISTQB_Exam-Structure-Tables_v1.19.pdf" rel="noopener noreferrer"&gt;Exam Structures and Rules tables&lt;/a&gt; (v1.19, August 2026), and the syllabus gives each chapter a minimum training time.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chapter&lt;/th&gt;
&lt;th&gt;Questions&lt;/th&gt;
&lt;th&gt;Training time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Basic Concepts&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;60 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Performance Measurement Fundamentals&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;55 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Performance Testing in the Software Lifecycle&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;195 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Performance Testing Tasks&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;475 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Tools&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;90 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8dspb9suiox527anjp4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8dspb9suiox527anjp4.png" alt="Grouped bar chart of the five CT-PT syllabus chapters. Chapter 4, Performance Testing Tasks, has 50% of the 40 questions and 54.3% of the 875 training minutes" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same tables sort the questions by thinking level. Two are K1 (remember), 25 are K2 (understand), 4 are K3 (apply) and 9 are K4 (analyze). Ten of the 13 apply and analyze questions sit in chapter 4.&lt;/p&gt;

&lt;p&gt;There is a timing catch in those tables. They allow 1 minute for a K1 question, 2 for K2, 3 for K3 and 4 for K4. For CT-PT that adds up to 100 minutes of nominal work (2 + 50 + 12 + 36) in a 90-minute exam. The only place to win the ten minutes back is the 25 K2 questions, so the definitions have to come fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you turn usage data into an operational profile?
&lt;/h2&gt;

&lt;p&gt;An operational profile is one distinct pattern of interaction with the application, and you build it in three steps: decide what data you need, gather it, and evaluate it. The syllabus asks for three kinds of data: the user personas and their roles, the generic tasks each role performs, and the estimated number of users for each role per unit of time.&lt;/p&gt;

&lt;p&gt;It also tells you where to look. Sources include workshops with product owners and sales managers, functional specifications and user stories, usage logs from the current system, and watching real users work through tasks. The approach is top-down. Start with broad profiles and split one further only if a test objective needs it.&lt;/p&gt;

&lt;p&gt;Here is the example used in the rest of this post. It is a made-up ticket shop, not something from the syllabus.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operational profile&lt;/th&gt;
&lt;th&gt;One session&lt;/th&gt;
&lt;th&gt;Think time&lt;/th&gt;
&lt;th&gt;Volume at peak&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Visitor&lt;/td&gt;
&lt;td&gt;Open the home page, list events, open one event&lt;/td&gt;
&lt;td&gt;9 s after each step&lt;/td&gt;
&lt;td&gt;100 sessions open at any moment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buyer&lt;/td&gt;
&lt;td&gt;Log in, search, add to cart, pay&lt;/td&gt;
&lt;td&gt;9 s after each step&lt;/td&gt;
&lt;td&gt;19,800 orders an hour&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two profiles are enough. The learning objective for this section is K4, analyze, so be ready to read usage data like this and say which profile matters. The syllabus singles out profiles whose tasks run often, need critical or frequent transactions between components, or move large volumes of data.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you build a load profile from the operational profiles?
&lt;/h2&gt;

&lt;p&gt;A load profile says how many instances run each operational profile, and how that number changes over the test. When the instances stand for people, they are called virtual users. The syllabus lists four shapes to combine: ramp-ups, ramp-downs, steps, and predefined distributions that copy a daily or seasonal cycle.&lt;/p&gt;

&lt;p&gt;Section 4.2.4 of the &lt;a href="https://istqb.org/wp-content/uploads/2024/11/ISTQB-CT-PT_Syllabus_v1.0_2018.pdf" rel="noopener noreferrer"&gt;CT-PT syllabus&lt;/a&gt; builds a stress profile from two parts. A step of 100 virtual users runs the first operational profile for the whole test as background load. A second group ramps up to 220 virtual users, holds for two hours, and ramps down. Added together, they give the system three hours of stress.&lt;/p&gt;

&lt;p&gt;In k6 that diagram is two scenarios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;scenarios&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;constant-vus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// a step: all 100 start at once&lt;/span&gt;
      &lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;visit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;vus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3h&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;stress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ramping-vus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;startVUs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;30m&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// ramp-up&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2h&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;   &lt;span class="c1"&gt;// hold&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;30m&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;    &lt;span class="c1"&gt;// ramp-down&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The syllabus does not print the ramp lengths. Thirty minutes each is my choice, so that the two ramps and the two-hour hold fill the three hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  How many virtual users give the throughput you planned?
&lt;/h2&gt;

&lt;p&gt;Divide the number of virtual users by the time one pass takes, and you have the throughput. The syllabus writes it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;system throughput = virtual users / (processing time + think time)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It then warns that a user count alone is not a measure of load. Its example: 500 users who each run a short query every minute produce 30,000 queries an hour. The same 500 users running one query an hour produce 500. The user count is the same and the load differs by a factor of 60.&lt;/p&gt;

&lt;p&gt;Now the ticket shop. A buyer session has four transactions. Say each takes 1 second to process and is followed by 9 seconds of think time. That is 4 seconds of processing and 36 seconds of thinking, 40 seconds a pass.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;targetPerSecond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;19800&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// 5.5 orders a second&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                         &lt;span class="c1"&gt;// seconds for one session&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;targetPerSecond&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;pass&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// 220 virtual users&lt;/span&gt;

&lt;span class="c1"&gt;// The system slows down under stress: 4 s of processing becomes 14 s&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;slowPass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                    &lt;span class="c1"&gt;// 50 seconds&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;actual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;slowPass&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;             &lt;span class="c1"&gt;// 4.4 orders a second&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actual&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;   &lt;span class="c1"&gt;// 220 15840&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same 220 virtual users now place 15,840 orders an hour, 20% under the plan. This is the sentence in the syllabus that candidates skip: when processing time goes up, throughput can drop even if everything else stays the same. Your stress test eases off at the moment it should push hardest.&lt;/p&gt;

&lt;p&gt;The syllabus explains why. A typical test setup is a closed system: the number of users is fixed, so when all of them are waiting for a response, no new user can arrive. Many public systems are open systems, where new users keep arriving while the current ones wait. The k6 documentation describes the same split in its page on &lt;a href="https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/" rel="noopener noreferrer"&gt;open and closed models&lt;/a&gt;. To hold the arrival rate steady, swap the executor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;stress_open&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;constant-arrival-rate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;timeUnit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2s&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// 11 sessions every 2 seconds = 5.5 a second&lt;/span&gt;
  &lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2h&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;preAllocatedVUs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// 5.5 x 40 s = 220 in flight, 5.5 x 50 s = 275&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What does the syllabus expect inside a performance test script?
&lt;/h2&gt;

&lt;p&gt;It expects three parts: an initialization section, a main section that can run many times, and a clean-up section. k6 uses different names for the same idea. Its &lt;a href="https://grafana.com/docs/k6/latest/using-k6/test-lifecycle/" rel="noopener noreferrer"&gt;test lifecycle&lt;/a&gt; has init code and &lt;code&gt;setup()&lt;/code&gt; for initialization, a scenario function for the main part, and &lt;code&gt;teardown()&lt;/code&gt; for clean-up.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;k6/http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;check&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sleep&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;k6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SharedArray&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;k6/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Trend&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;k6/metrics&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;scenario&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;k6/execution&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Initialization: load test data and declare metrics. No requests here.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buyers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SharedArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buyers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./buyers.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;orderTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Trend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_time&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://shop.test.example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;JSON_HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Still initialization. A broken system gives no useful load numbers.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/health`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;system under test is not ready&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Main section: one pass is one buyer session.&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;buy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;me&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;buyers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iterationInTest&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;buyers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;   &lt;span class="c1"&gt;// parameterization&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;spent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                         &lt;span class="c1"&gt;// outer transaction&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/login`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;me&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON_HEADERS&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;logged in&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                             &lt;span class="c1"&gt;// correlation&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;JSON_HEADERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nx"&gt;spent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                                                    &lt;span class="c1"&gt;// think time&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/events?city=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                            &lt;span class="c1"&gt;// correlation again&lt;/span&gt;
    &lt;span class="nx"&gt;spent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;add to cart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                 &lt;span class="c1"&gt;// nested transaction&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/cart`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;eventId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;seats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;two seats in cart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;seats&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;spent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pay&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/orders`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order confirmed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CONFIRMED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;spent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;orderTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// response time of the whole order, think time left out&lt;/span&gt;
  &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Clean-up&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;teardown&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/test-data/reset`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;visit&lt;/code&gt; function for the background scenario is left out to keep this short. Five things in the script map to lines of the syllabus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transactions.&lt;/strong&gt; A transaction runs from the start of a request to the end of the processing it triggers. Transactions can be nested, so one run measures each step and the order as a whole. That is what the inner groups and the &lt;code&gt;order_time&lt;/code&gt; metric do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Think time.&lt;/strong&gt; The syllabus states that transaction response time plus think time equals elapsed time. The &lt;code&gt;sleep(9)&lt;/code&gt; calls are the think time, and the trend records response time only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timers.&lt;/strong&gt; Time a meaningful unit of work, such as submitting an order. A protocol-level script like this one measures server and network time only. A script that drives the GUI measures end to end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result verification.&lt;/strong&gt; Checking the HTTP return code is the minimum. The &lt;code&gt;check&lt;/code&gt; calls look at what came back: two seats, a confirmed order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scripts are software.&lt;/strong&gt; Review the script and test it with the whole range of input data before trusting its numbers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Correlation gets its own paragraph in the syllabus. If you record a session at the protocol level, the recording holds identifiers that were valid once, such as the login token above. They have to become variables that are filled from each response. The syllabus says incorrect or missing correlation is the main reason recorded scripts fail on playback, and the k6 docs carry &lt;a href="https://grafana.com/docs/k6/latest/examples/correlation-and-dynamic-data/" rel="noopener noreferrer"&gt;examples of extracting tokens from responses&lt;/a&gt; for JSON and for form fields.&lt;/p&gt;

&lt;p&gt;Parameterization is the other half. Run every virtual user with the same name and the same data, and the results mislead in one of two directions. The data may be fully cached, which makes the system look faster than production. Or users may queue on a lock for the same record, which makes it look slower.&lt;/p&gt;

&lt;p&gt;That is why the script reads buyers from a file and gives each iteration a different one. The k6 page on &lt;a href="https://grafana.com/docs/k6/latest/examples/data-parameterization/" rel="noopener noreferrer"&gt;data parameterization&lt;/a&gt; shows the same pattern with JSON and CSV files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does the report use a percentile and not only an average?
&lt;/h2&gt;

&lt;p&gt;Because the average can be skewed by outliers, and the syllabus says so in those words. It lists four ways to report transaction response time: minimum, maximum, average and a percentile such as the 90th. Ten response times show the problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;210&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;230&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;240&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4100&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;   &lt;span class="c1"&gt;// 842 220 2600&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eight of the ten users waited a quarter of a second or less. Two waited seconds. The average of 842 ms describes none of them. The median shows the typical user, and the 90th percentile shows the tail.&lt;/p&gt;

&lt;p&gt;The syllabus adds two points that are easy to miss. A goal of 100% compliance is not recommended, because the resources it needs may be too large for a minor gain to users. And you look at the status of the virtual users before anything else. A failed transaction takes far less time than a completed one, so failures can make the transactions-per-second figure look better than it is.&lt;/p&gt;

&lt;p&gt;In k6 you write the goal down as a threshold, and the run fails when it is missed. The &lt;a href="https://grafana.com/docs/k6/latest/using-k6/thresholds/" rel="noopener noreferrer"&gt;thresholds reference&lt;/a&gt; lists the aggregation methods you can use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;thresholds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;http_req_failed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rate&amp;lt;0.01&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;     &lt;span class="c1"&gt;// under 1% failed requests&lt;/span&gt;
    &lt;span class="na"&gt;order_time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;p(90)&amp;lt;3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;         &lt;span class="c1"&gt;// 90% of orders within 3 s of response time&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Which test type fits which objective?
&lt;/h2&gt;

&lt;p&gt;The syllabus defines seven types under the umbrella term performance testing, and chapter 1 carries six questions. The first two columns below follow section 1.2. The third column is my shorthand for the load profile each one usually needs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;What it focuses on&lt;/th&gt;
&lt;th&gt;Typical load shape&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Load&lt;/td&gt;
&lt;td&gt;Handling increasing levels of anticipated, realistic load&lt;/td&gt;
&lt;td&gt;Ramp up to the expected level and hold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stress&lt;/td&gt;
&lt;td&gt;Peak loads at or beyond the specified limits, or reduced resources&lt;/td&gt;
&lt;td&gt;Ramp past the expected maximum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Meeting future needs, such as more users or more stored data&lt;/td&gt;
&lt;td&gt;Repeated runs with growing load or data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spike&lt;/td&gt;
&lt;td&gt;Sudden bursts of peak load, then a return to a steady state&lt;/td&gt;
&lt;td&gt;Step up, step down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endurance&lt;/td&gt;
&lt;td&gt;Stability over a period that fits the system's use&lt;/td&gt;
&lt;td&gt;Flat load for a long time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency&lt;/td&gt;
&lt;td&gt;Specific actions that happen at the same moment&lt;/td&gt;
&lt;td&gt;Many users doing one thing at once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capacity&lt;/td&gt;
&lt;td&gt;How many users or transactions it supports while meeting its objectives&lt;/td&gt;
&lt;td&gt;Step up until an objective fails&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Endurance testing is the one that finds resource problems which build up slowly. The syllabus gives memory leaks, database connections and thread pools as its examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short video on the exam
&lt;/h2&gt;

&lt;p&gt;ProcessExam's channel has a three-minute video with five preparation tips for CT-PT. It covers the study side that this post leaves out.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/I87D0f9Nweo" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How should you split your study time?
&lt;/h2&gt;

&lt;p&gt;Follow the syllabus's own weighting. The five chapters add up to 875 minutes of minimum training time, about 14 and a half hours, and chapter 4 takes 475 of them. A plan that gives chapter 4 half of your hours matches both the training time and the question count.&lt;/p&gt;

&lt;p&gt;A split that works in practice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Chapters 1 and 2 first, in one sitting. They are ten questions, mostly definitions, and they are where you win back time on exam day.&lt;/li&gt;
&lt;li&gt;Chapter 4 over three or four sittings, with a keyboard. Build one operational profile, one load profile and one script for a system you know.&lt;/li&gt;
&lt;li&gt;Chapter 3 next. Its seven questions are about risk: which performance risks belong to which architecture, and which test activity belongs to which lifecycle phase.&lt;/li&gt;
&lt;li&gt;Chapter 5 last. Three questions on tool types and how to judge whether a tool suits a project.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want every learning objective in one place to tick off, the &lt;a href="https://www.processexam.com/istqb/istqb-ct-pt-certification-exam-syllabus" rel="noopener noreferrer"&gt;CT-PT syllabus topics listed by chapter on ProcessExam&lt;/a&gt; work as a checklist.&lt;/p&gt;

&lt;p&gt;Finish with ISTQB's own sample exam, which is a free download on the certification page. Time yourself at 90 minutes. The answer sheet gives the learning objective and K-level of every question, so note which level each wrong answer was.&lt;/p&gt;

&lt;p&gt;For the weeks before the exam, this &lt;a href="https://www.patreon.com/beatricerascon/posts/master-istqb-ct-169500184" rel="noopener noreferrer"&gt;CT-PT preparation playbook&lt;/a&gt; goes deeper into planning and revision than a code walkthrough can.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. How many questions are on the ISTQB CT-PT exam, and what is the passing score?
&lt;/h3&gt;

&lt;p&gt;The exam has 40 multiple-choice questions worth one point each, and you need 26 points to pass, which is 65%. You get 90 minutes, or 113 minutes if the exam is not in your native language.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Do I need the Foundation Level certificate before taking CT-PT?
&lt;/h3&gt;

&lt;p&gt;Yes. ISTQB states that candidates must hold the Certified Tester Foundation Level certificate to gain the Performance Testing certification.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Does the CT-PT exam test a specific tool such as JMeter or k6?
&lt;/h3&gt;

&lt;p&gt;No. The syllabus names no tool. Chapter 5 covers types of tools (load generators, load management consoles, monitoring tools) and how to judge whether a tool suits a project, and it carries 3 of the 40 questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Which chapter of the CT-PT syllabus has the most exam questions?
&lt;/h3&gt;

&lt;p&gt;Chapter 4, Performance Testing Tasks, has 20 of the 40 questions. Chapter 3 has 7, chapter 1 has 6, chapter 2 has 4 and chapter 5 has 3.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Is the 2018 CT-PT syllabus still the current version?
&lt;/h3&gt;

&lt;p&gt;Yes, as of 14 October 2026. The ISTQB certification page offers CT-PT Syllabus v1.0 (2018) as its syllabus download, and the Exam Structures and Rules tables dated August 2026 still list CT-PT with 40 questions and 90 minutes.&lt;/p&gt;

&lt;p&gt;Written by the team behind ProcessExam, a practice-test site for process, project and software testing certifications. We are not affiliated with ISTQB.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>performance</category>
      <category>k6</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Qlik Sense Data Architect Certification: Six Load Scripts to Write Before the QSDA Exam</title>
      <dc:creator>Palak Mazumdar</dc:creator>
      <pubDate>Tue, 13 Oct 2026 11:23:17 +0000</pubDate>
      <link>https://dev.to/palak_mazumdar_f5431445f6/qlik-sense-data-architect-certification-six-load-scripts-to-write-before-the-qsda-exam-5a3h</link>
      <guid>https://dev.to/palak_mazumdar_f5431445f6/qlik-sense-data-architect-certification-six-load-scripts-to-write-before-the-qsda-exam-5a3h</guid>
      <description>&lt;p&gt;The Qlik Sense Data Architect certification (QSDA) is a 50-question, 90-minute exam with a 62% passing score. Two of its five topic areas, Data Model Design and Data Transformations, carry 66% of the weight, and most of that work happens in the data load script.&lt;/p&gt;

&lt;p&gt;So the plain way to check your readiness is to write the scripts. Below are six short ones. Five use inline data, so you can paste them into the Data load editor of an empty Qlik Sense app. The syntax follows Qlik's script reference for Qlik Cloud as it read on 13 October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the QSDA exam cover, in numbers?
&lt;/h2&gt;

&lt;p&gt;It covers five topic areas, and the two about modelling and transforming data are the largest. Qlik lists them on its &lt;a href="https://learning.qlik.com/student/activity/2161345-qlik-sense-data-architect-certification" rel="noopener noreferrer"&gt;exam details page for the Data Architect certification&lt;/a&gt;, which also says the exam is platform-neutral: the content applies to client-managed Qlik Sense and to Qlik Cloud.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic area&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;About how many of 50 questions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identify Requirements&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Connectivity&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Model Design&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Transformations&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The question counts are our arithmetic on Qlik's weights, not figures Qlik publishes. Qlik also notes that exam content is updated from time to time and that the number and difficulty of questions may change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk9cndz179sf21wecf70d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk9cndz179sf21wecf70d.png" alt="Fifty squares, one per QSDA exam question, grouped into the five topic areas: Identify Requirements 20%, Data Connectivity 8%, Data Model Design 28%, Data Transformations 38%, Validation 6%"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The recommended experience on the same page reads like a job description: writing load scripts and validating data, basic ETL, creating connections to data sources, understanding the QVD layer, and knowing SQL and relational databases. The six scripts below follow that list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does a synthetic key appear, and how do you remove it?
&lt;/h2&gt;

&lt;p&gt;A synthetic key appears when two tables share two or more fields. Load these two tables and open the data model viewer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sales:
LOAD * INLINE [
Region, Year, Month, Sales
North, 2026, May, 245
North, 2026, June, 127
South, 2026, June, 645
];

Budget:
LOAD * INLINE [
Region, Year, Month, Budget
North, 2026, May, 200
North, 2026, June, 150
South, 2026, June, 600
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both tables hold &lt;code&gt;Region&lt;/code&gt;, &lt;code&gt;Year&lt;/code&gt; and &lt;code&gt;Month&lt;/code&gt;, so Qlik Sense builds a &lt;code&gt;$Syn 1&lt;/code&gt; key and a &lt;code&gt;$Syn 1 Table&lt;/code&gt; that stores every combination of the three. Qlik's page on &lt;a href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/synthetic-keys.htm" rel="noopener noreferrer"&gt;how synthetic keys form and how to handle them&lt;/a&gt; says the key is sometimes correct, but that most times it is there because of an error in the script.&lt;/p&gt;

&lt;p&gt;The fix that page suggests is to form your own key, typically by string concatenation inside &lt;code&gt;AutoNumber&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight q"&gt;&lt;code&gt;&lt;span class="n"&gt;Sales&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;LOAD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Region&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Year&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Month&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sales&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;AutoNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'|'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Year&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'|'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RegionMonthKey&lt;/span&gt;
&lt;span class="n"&gt;INLINE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="n"&gt;Region&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Year&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Month&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sales&lt;/span&gt;
&lt;span class="n"&gt;North&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;245&lt;/span&gt;
&lt;span class="n"&gt;North&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;June&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;
&lt;span class="n"&gt;South&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;June&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;645&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="n"&gt;Budget&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;LOAD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Budget&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;AutoNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'|'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Year&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'|'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RegionMonthKey&lt;/span&gt;
&lt;span class="n"&gt;INLINE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="n"&gt;Region&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Year&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Month&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Budget&lt;/span&gt;
&lt;span class="n"&gt;North&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;
&lt;span class="n"&gt;North&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;June&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;
&lt;span class="n"&gt;South&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;June&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now only &lt;code&gt;RegionMonthKey&lt;/code&gt; links the two tables, and the three descriptive fields live in &lt;code&gt;Sales&lt;/code&gt; alone. One limit is worth remembering. &lt;code&gt;AutoNumber&lt;/code&gt; hands out integers in the order values are read, so its keys only match between tables built in the same reload. For keys that must survive between reloads, for example in QVD files, Qlik points to the &lt;code&gt;Hash128&lt;/code&gt;, &lt;code&gt;Hash160&lt;/code&gt; and &lt;code&gt;Hash256&lt;/code&gt; functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What turns three tidy tables into a circular reference?
&lt;/h2&gt;

&lt;p&gt;A circular reference is a loop: there is more than one path of associations between two fields. No pair of tables below shares two fields, so there is no synthetic key, and the model is still wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Orders:
LOAD * INLINE [
OrderID, CustomerID, Date, Amount
1, C1, 2026-05-02, 120
2, C2, 2026-05-03, 80
];

Customers:
LOAD * INLINE [
CustomerID, Region
C1, North
C2, South
];

Targets:
LOAD * INLINE [
Region, Date, Target
North, 2026-05-02, 100
South, 2026-05-03, 90
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Orders&lt;/code&gt; links to &lt;code&gt;Customers&lt;/code&gt; on &lt;code&gt;CustomerID&lt;/code&gt;, &lt;code&gt;Customers&lt;/code&gt; links to &lt;code&gt;Targets&lt;/code&gt; on &lt;code&gt;Region&lt;/code&gt;, and &lt;code&gt;Targets&lt;/code&gt; links back to &lt;code&gt;Orders&lt;/code&gt; on &lt;code&gt;Date&lt;/code&gt;. The reload completes, but the progress window reports a circular reference and the data model viewer draws the loop with dotted lines. Qlik's tutorial on &lt;a href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/circular-references.htm" rel="noopener noreferrer"&gt;resolving a circular reference&lt;/a&gt; gives the simplest way out: rename or remove one of the fields.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Targets:
LOAD Region,
     Date AS TargetDate,
     Target
INLINE [
Region, Date, Target
North, 2026-05-02, 100
South, 2026-05-03, 90
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The loop is gone, because &lt;code&gt;Targets&lt;/code&gt; now reaches &lt;code&gt;Orders&lt;/code&gt; by one path only, through &lt;code&gt;Customers&lt;/code&gt;. The rename has a price: selecting an order date no longer filters the targets. If the business compares orders and targets by region and by day, the better design is one composite key built from &lt;code&gt;Region&lt;/code&gt; and &lt;code&gt;Date&lt;/code&gt;, as in the first script, with &lt;code&gt;Region&lt;/code&gt; mapped into &lt;code&gt;Orders&lt;/code&gt; first. That mapping is the next script.&lt;/p&gt;

&lt;h2&gt;
  
  
  When is ApplyMap a better choice than a join?
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;ApplyMap&lt;/code&gt; when you need one attribute from a lookup table and the row count of the fact table must not change.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight q"&gt;&lt;code&gt;&lt;span class="n"&gt;RegionMap&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;MAPPING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LOAD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;INLINE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="n"&gt;CustomerID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Region&lt;/span&gt;
&lt;span class="n"&gt;C1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;North&lt;/span&gt;
&lt;span class="n"&gt;C2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;South&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;LOAD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;CustomerID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;ApplyMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="n"&gt;RegionMap&lt;/span&gt;&lt;span class="o"&gt;',&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CustomerID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Unassigned&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Region&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;
&lt;span class="n"&gt;INLINE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="n"&gt;OrderID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CustomerID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;C1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;C2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;C9&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Order 3 belongs to a customer the map does not know, so it gets &lt;code&gt;Unassigned&lt;/code&gt;, the third argument. Leave that argument out and the function returns the input value as it is, here &lt;code&gt;C9&lt;/code&gt;. A mapping table has two columns, comparison values first, and Qlik drops it automatically when the script ends. The model gains a field and no extra table.&lt;/p&gt;

&lt;p&gt;A join behaves differently. Qlik's Join reference says the target table can end up with more or fewer records than it started with, depending on how unique the join values are. If &lt;code&gt;C1&lt;/code&gt; appeared twice in the lookup, a left join would write order 1 twice and every &lt;code&gt;Sum(Amount)&lt;/code&gt; would be too high. &lt;code&gt;ApplyMap&lt;/code&gt; returns one value for each row, so that cannot happen. The &lt;a href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/MappingFunctions/ApplyMap.htm" rel="noopener noreferrer"&gt;ApplyMap function reference&lt;/a&gt; adds one warning: do not give the output field the name of an input field, as in &lt;code&gt;ApplyMap('Map', A) AS A&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you make missing values selectable in a filter?
&lt;/h2&gt;

&lt;p&gt;First decide whether the value is a blank or a real NULL, because the two need different handling. A blank cell in a text file or an inline table arrives as an empty string, and an expression can replace it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customers:
LOAD CustomerID,
     If(Len(Trim(Segment)) = 0, 'No segment', Segment) AS Segment
INLINE [
CustomerID, Segment
C1, Retail
C2,
C3, Wholesale
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Len(Trim(Segment)) = 0&lt;/code&gt; is true for an empty string, for a string of spaces and for NULL, so all three end up in one value that a user can click in a filter pane. Customer &lt;code&gt;C2&lt;/code&gt; now has the segment &lt;code&gt;No segment&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Real NULLs come from other places: a database connection, a join, or a forced concatenation of tables with different fields. Qlik's notes on &lt;a href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/null-value-handling.htm" rel="noopener noreferrer"&gt;NULL value handling in the load script&lt;/a&gt; say these NULLs generally cannot be used for associations or selections unless the &lt;code&gt;NullAsValue&lt;/code&gt; statement is used.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NullAsValue Segment;
SET NullValue = 'No segment';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;NullAsValue&lt;/code&gt; works as a switch. It applies to the loading statements that come after it, and &lt;code&gt;NullAsNull&lt;/code&gt; turns it off again. &lt;code&gt;NullValue&lt;/code&gt; is the text that replaces the NULLs in the listed fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does an incremental load keep a reload short?
&lt;/h2&gt;

&lt;p&gt;It reads only the new and changed rows from the database, takes everything else from a QVD file, and then writes the QVD again. This script needs a database connection, so it is the one you cannot simply paste and run. It adapts the insert and update case from Qlik's guide to &lt;a href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/use-QVD-files-incremental-load.htm" rel="noopener noreferrer"&gt;incremental load with QVD files&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight q"&gt;&lt;code&gt;&lt;span class="n"&gt;LIB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CONNECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="n"&gt;SalesDb&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;LET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vThisExecTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;SQL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CustomerID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ModifiedAt&lt;/span&gt;
&lt;span class="n"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
&lt;span class="n"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ModifiedAt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vLastExecTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;   // use your database's date syntax&lt;/span&gt;

&lt;span class="n"&gt;Concatenate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;LOAD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CustomerID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ModifiedAt&lt;/span&gt;
&lt;span class="n"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="n"&gt;DataFiles&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Orders.qvd&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qvd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderID&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ScriptErrorCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;THEN&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;STORE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="n"&gt;DataFiles&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Orders.qvd&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qvd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;LET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vLastExecTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vThisExecTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three details are worth being able to explain.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Order matters. The changed rows load first, so &lt;code&gt;WHERE NOT Exists(OrderID)&lt;/code&gt; can skip the old version of every updated order when the QVD is read.&lt;/li&gt;
&lt;li&gt;Qlik's guide says this &lt;code&gt;WHERE&lt;/code&gt; clause forces the QVD to be read in standard mode instead of optimized mode. That is still much faster than reading the whole database.&lt;/li&gt;
&lt;li&gt;The QVD and the timestamp are only written when the script ran without errors. Without that test, a failed reload would move &lt;code&gt;vLastExecTime&lt;/code&gt; forward and the missed rows would never be fetched.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first run needs a full load to create the QVD. Rows deleted in the source need one more step, an inner join against the current keys, which the same guide shows.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you match a sale to the territory that was valid on that day?
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;IntervalMatch&lt;/code&gt; with a key field. This is the slowly changing dimension case that the first topic area of the exam mentions: a sales rep moves from one territory to another, and each sale must keep the territory that was valid on the sale date.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sales:
LOAD Date#(SaleDate, 'YYYY-MM-DD') AS SaleDate, RepID, Amount
INLINE [
SaleDate, RepID, Amount
2026-02-10, R1, 100
2026-07-05, R1, 250
2026-07-06, R2, 90
];

RepHistory:
LOAD Date#(ValidFrom, 'YYYY-MM-DD') AS ValidFrom,
     Date#(ValidTo, 'YYYY-MM-DD') AS ValidTo,
     RepID, Territory
INLINE [
ValidFrom, ValidTo, RepID, Territory
2026-01-01, 2026-06-30, R1, North
2026-07-01, 2026-12-31, R1, South
2026-01-01, 2026-12-31, R2, North
];

Left Join (Sales)
IntervalMatch (SaleDate, RepID)
LOAD ValidFrom, ValidTo, RepID
RESIDENT RepHistory;

Left Join (Sales)
LOAD ValidFrom, ValidTo, RepID, Territory
RESIDENT RepHistory;

DROP TABLE RepHistory;
DROP FIELDS ValidFrom, ValidTo;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Date#&lt;/code&gt; reads the text as a date, which gives each value a number behind it. That matters here, because &lt;code&gt;IntervalMatch&lt;/code&gt; disregards an interval whose limits are not numeric. The intervals are closed, so a sale on 30 June still belongs to the first row.&lt;/p&gt;

&lt;p&gt;The first join adds the matching &lt;code&gt;ValidFrom&lt;/code&gt; and &lt;code&gt;ValidTo&lt;/code&gt; to each sale, using &lt;code&gt;SaleDate&lt;/code&gt; and &lt;code&gt;RepID&lt;/code&gt;. The second join uses those fields to fetch &lt;code&gt;Territory&lt;/code&gt;, and the two &lt;code&gt;DROP&lt;/code&gt; statements remove what is no longer needed. The result is one &lt;code&gt;Sales&lt;/code&gt; table in which rep &lt;code&gt;R1&lt;/code&gt; sold in North in February and in South in July. The &lt;a href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/IntervalMatch.htm" rel="noopener noreferrer"&gt;IntervalMatch prefix reference&lt;/a&gt; covers both forms, with and without key fields.&lt;/p&gt;

&lt;p&gt;If you leave the &lt;code&gt;IntervalMatch&lt;/code&gt; table in the model as a separate table, it shares several fields with each of its neighbours, and the synthetic keys from the first script come back.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you prove the script loaded what you expected?
&lt;/h2&gt;

&lt;p&gt;Count rows and count keys, and write both to the log. Validation is only 6% of the exam, but it is the habit that catches the mistakes from every other section. Add this after the &lt;code&gt;Orders&lt;/code&gt; table from the mapping script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LET vRows = NoOfRows('Orders');
LET vKeys = FieldValueCount('OrderID');
TRACE Orders: $(vRows) rows, $(vKeys) distinct OrderID values;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;NoOfRows&lt;/code&gt; returns the number of rows in a loaded table, and &lt;code&gt;FieldValueCount&lt;/code&gt; returns the number of distinct values in a field. If &lt;code&gt;OrderID&lt;/code&gt; is the primary key and the two numbers differ, a join has multiplied rows or the source holds duplicate keys. The &lt;a href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Trace.htm" rel="noopener noreferrer"&gt;Trace statement&lt;/a&gt; writes the line to the script progress window and to the script log.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch: a short overview of preparing for the QSDA exam
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/h7fuJtT29-Q" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The video is from AnalyticsExam's channel and runs just under three minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should you do after the six scripts?
&lt;/h2&gt;

&lt;p&gt;Change each script and predict the result before you reload. Add a fourth shared field to the first one. Put a duplicate customer in the mapping table. Move a sale to a date that no interval covers. Being able to say what the data model viewer will show before you open it is the skill the exam's scenario questions ask for.&lt;/p&gt;

&lt;p&gt;Then practise reading those scenarios against the clock. AnalyticsExam publishes &lt;a href="https://www.analyticsexam.com/qlik/qlik-sense-data-architect-qsda-certification-exam-sample-questions" rel="noopener noreferrer"&gt;free QSDA sample questions&lt;/a&gt; that show the question style.&lt;/p&gt;

&lt;p&gt;For the full length, 50 questions in 90 minutes works out to a little under two minutes each, and that pace needs practice as well.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.analyticsexam.com/qlik/qsda-qlik-sense-data-architect" rel="noopener noreferrer"&gt;Qlik Sense Data Architect certification practice exam&lt;/a&gt; on the same site is timed and multiple choice, and it keeps a result history so you can track your progress from one attempt to the next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. How many questions are on the Qlik Sense Data Architect exam?
&lt;/h3&gt;

&lt;p&gt;The exam has 50 questions and lasts 90 minutes, and the passing score is 62%. Qlik notes that exam content is updated periodically and that the number and difficulty of questions may change.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Does the QSDA exam cover Qlik Cloud or client-managed Qlik Sense?
&lt;/h3&gt;

&lt;p&gt;Both. Qlik describes the exam as platform-neutral, which means the content applies to client-managed Qlik Sense and to Qlik Cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Which topic area carries the most weight on the QSDA exam?
&lt;/h3&gt;

&lt;p&gt;Data Transformations carries the most at 38%, followed by Data Model Design at 28%. Identify Requirements is 20%, Data Connectivity is 8% and Validation is 6%.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Do I need to know SQL for the Qlik Sense Data Architect certification?
&lt;/h3&gt;

&lt;p&gt;Qlik's recommended experience includes being familiar with SQL and relational databases. It also lists the ability to write Qlik Sense load scripts and validate data, and a basic understanding of extract, transform and load.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Is a synthetic key always a mistake?
&lt;/h3&gt;

&lt;p&gt;No. Qlik's documentation says a synthetic key is sometimes correct, but that most times it is there because of an error in the script. Several synthetic keys, or one built on another, point to an incorrect data model.&lt;/p&gt;

&lt;p&gt;Written by the team behind AnalyticsExam, an exam-prep site for analytics certifications. We are not affiliated with Qlik.&lt;/p&gt;

</description>
      <category>qlik</category>
      <category>dataengineering</category>
      <category>analytics</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>ACP-420 Exam Walkthrough: Follow One Service Ticket Through All Eight Domains</title>
      <dc:creator>Palak Mazumdar</dc:creator>
      <pubDate>Tue, 06 Oct 2026 05:03:49 +0000</pubDate>
      <link>https://dev.to/palak_mazumdar_f5431445f6/acp-420-exam-walkthrough-follow-one-service-ticket-through-all-eight-domains-loj</link>
      <guid>https://dev.to/palak_mazumdar_f5431445f6/acp-420-exam-walkthrough-follow-one-service-ticket-through-all-eight-domains-loj</guid>
      <description>&lt;p&gt;ACP-420 is Atlassian's Managing Jira Service Projects for Cloud exam: 75 questions in 180 minutes, and you need 50 correct to pass. The fastest way to understand it is not to memorise the eight domains as a list, but to follow one customer request from the moment it is raised until it shows up on a dashboard.&lt;/p&gt;

&lt;p&gt;Atlassian prices the exam at $249 plus tax, runs it proctored online, and keeps the certification valid for 24 months, according to the &lt;a href="https://community.atlassian.com/learning/certifications/managing-jira-service-projects-for-cloud" rel="noopener noreferrer"&gt;Managing Jira Service Projects for Cloud certification page&lt;/a&gt;. The scope is narrow on purpose. It covers Jira Service Management Cloud, company-managed projects only, so team-managed project quirks are not what you are being tested on.&lt;/p&gt;

&lt;p&gt;Picture a simple case. An employee at a mid-sized company cannot get into the VPN and opens a request on the IT help center. That one ticket will touch every part of the exam before it closes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbuk89y8pxz9elsgbh2yr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbuk89y8pxz9elsgbh2yr.png" alt="ACP-420 exam domains drawn as a 180-minute clock face, with each domain's share of the exam as a slice" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the ACP-420 exam actually measure?
&lt;/h2&gt;

&lt;p&gt;It measures whether you can configure a service project so that the right people reach the right request type, the work lands in the right queue, and the team can prove it met its targets. Most questions describe a team's requirement and ask which setting delivers it.&lt;/p&gt;

&lt;p&gt;The current blueprint is version 2, dated April 2025. You can read every objective in the &lt;a href="https://assets.ctfassets.net/xkfunaz6zr9g/4hdJr7OSlHjFPefoR6LWvz/fc2dfb84f7e68bbc4f1648ad440a64a6/acp-420-managing-service-projects-for-cloud.pdf" rel="noopener noreferrer"&gt;official ACP-420 exam topics PDF&lt;/a&gt;. Here are the eight domains and their approximate weights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure customer facing features: about 21%&lt;/li&gt;
&lt;li&gt;Configure agent facing features: about 19%&lt;/li&gt;
&lt;li&gt;Distinguish among users, project roles, and permissions: about 16%&lt;/li&gt;
&lt;li&gt;Configure the customer portal and notifications: about 12%&lt;/li&gt;
&lt;li&gt;Manage automation rules: about 11%&lt;/li&gt;
&lt;li&gt;Utilize specialized capabilities for adding context to tickets: about 9%&lt;/li&gt;
&lt;li&gt;Configure reporting: about 7%&lt;/li&gt;
&lt;li&gt;Manage the knowledge base: about 5%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The top three domains make up 56% of the exam. That matters later, when you plan your study weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop 1: who is allowed to raise the ticket?
&lt;/h2&gt;

&lt;p&gt;Before the VPN request even exists, the exam wants to know who can see the portal and who can act on what arrives. This is the permissions domain, roughly 16% of the questions.&lt;/p&gt;

&lt;p&gt;Get clear on the two sides. External users are customers, organizations, request participants, stakeholders and reporters. Internal users are agents, collaborators, watchers, assignees, project admins, Jira admins and org admins. A collaborator can join internal discussion on a ticket but is not a full agent, and the exam likes to test that line.&lt;/p&gt;

&lt;p&gt;Self-check questions for this stop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can customers sign themselves up, or must an admin add them? Where is that set?&lt;/li&gt;
&lt;li&gt;What changes when customer access without login is allowed in global settings?&lt;/li&gt;
&lt;li&gt;How do you let one organization's members see each other's requests, but not other organizations' requests?&lt;/li&gt;
&lt;li&gt;Which project role do you use to add an agent, and how would issue-level security hide a sensitive HR ticket from most of the team?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a customer reports "I can't see my request", work through product access, then project role, then permission scheme, then issue-level security. The blueprint lists that troubleshooting path almost word for word.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop 2: what does the customer see on the portal?
&lt;/h2&gt;

&lt;p&gt;The customer sees a help center, a portal group called something like "Access and accounts", and a request type named "Can't connect to VPN". Building that experience is the largest slice of the exam: customer facing features at about 21%, plus the portal and notifications at about 12%.&lt;/p&gt;

&lt;p&gt;For request types, know how each one maps to an underlying issue type and why hiding a request type from the portal is done by removing its portal groups. Know where a field is made required, in the field configuration or in the request type, and how the customer-facing status name can differ from the workflow status agents see.&lt;/p&gt;

&lt;p&gt;Forms add a second layer. You should be comfortable building a form from a template, using sections with conditional logic, linking form fields to Jira fields, and attaching forms either by hand or through automation. Small form preferences show up too, such as locking a form after submission or saving a PDF each time it is resubmitted.&lt;/p&gt;

&lt;p&gt;Email is the other front door. Expect questions on adding a custom email account, choosing which request type email creates, and using an allowlist or blocklist for domains. Approvals sit here as well: a preset list of approvers versus letting the customer choose one.&lt;/p&gt;

&lt;p&gt;On the portal side, review branding, announcements, help-content links, portal translations and the virtual agent. The virtual agent needs a default request type and intents, and its standard flows (greet, escalate, resolve, match intent, auto-close) can be reworded. For a domain-by-domain checklist of all of this, the &lt;a href="https://www.certfun.com/atlassian/atlassian-managing-jira-service-projects-cloud-acp-mjsp-exam-syllabus" rel="noopener noreferrer"&gt;ACP-420 syllabus breakdown on CertFun&lt;/a&gt; lists every sub-objective in one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop 3: how does the ticket reach an agent on time?
&lt;/h2&gt;

&lt;p&gt;The VPN ticket now lands in a queue, starts an SLA clock and may page someone on call. This is the agent facing features domain, about 19% of the exam.&lt;/p&gt;

&lt;p&gt;Queues are JQL filters. The exam expects you to turn a requirement such as "show the IT team every open access request that is close to breaching" into a queue, using SLA functions in the JQL, and to group and reorder queues sensibly.&lt;/p&gt;

&lt;p&gt;SLAs are where many candidates lose easy marks. An SLA has start, pause and stop conditions, goals that can differ by priority or request type, and a calendar that decides which hours count. Atlassian's own guide on how to &lt;a href="https://support.atlassian.com/jira-service-management-cloud/docs/create-service-level-agreements-slas/" rel="noopener noreferrer"&gt;create service level agreements to manage goals&lt;/a&gt; is worth working through in a free cloud site, because the exam asks you to troubleshoot SLAs that "aren't counting", and that skill only comes from seeing it happen.&lt;/p&gt;

&lt;p&gt;The same domain covers the features tab. Know when to switch on service requests, incidents, problems, changes and post-incident reviews, plus on-call schedules, rotations, routing rules and escalation policies, and how alert priorities map to incident priorities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop 4: what context gets attached to the ticket?
&lt;/h2&gt;

&lt;p&gt;The agent looks at the request and needs context: which laptop, which service, which entitlement. That is the specialized capabilities domain, about 9%.&lt;/p&gt;

&lt;p&gt;Note the wording for Assets. You must use object schemas, object types, objects and attributes, and reference Assets custom fields in request types, forms and queues, but you are not expected to configure Assets itself. Services work differently. You do enable and configure them, including service tiers, owners, change approvers, responders and stakeholders, and tiers can drive automation and alerts.&lt;/p&gt;

&lt;p&gt;Products and entitlements are the third piece. If only customers with a valid product entitlement may raise a certain request type, making the Entitlement field required is the setting that enforces it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop 5: what happens when the same ticket arrives 50 times a week?
&lt;/h2&gt;

&lt;p&gt;When the VPN problem repeats, the team should stop handling it by hand. Two domains cover this: automation at about 11% and the knowledge base at about 5%.&lt;/p&gt;

&lt;p&gt;Automation questions are scenario-based. You decide when a rule beats a plain notification, configure triggers, conditions and actions, and handle service-specific triggers such as "SLA threshold breached", "Approval completed" and "Forms submitted". Smart values for strings, dates and lists appear, as do auto-resolve and auto-close rules. When a rule fails, you check the audit log and the automation service status page, and you transfer rule ownership so error alerts reach the right person.&lt;/p&gt;

&lt;p&gt;The knowledge base side is smaller but quick to learn. Link a Confluence space to the project, control who can view and edit articles, set article suggestions per request type, and restrict suggestions to specific labels. A good "VPN troubleshooting" article that the portal suggests before the request is submitted is the cheapest ticket you will ever close.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop 6: how does the team prove it is working?
&lt;/h2&gt;

&lt;p&gt;Reporting closes the loop, and at about 7% it is a small domain with a precise toolset. You need JQL with service-specific functions such as approved, breached and entitlement, saved filters shared with the right people, and dashboards built from service management gadgets.&lt;/p&gt;

&lt;p&gt;Customer satisfaction settings belong here too. The exam frames this as analysis: given SLA performance, CSAT scores and knowledge base reports, which project setting would you change? Go back to Stop 3 and Stop 5 for the answer, because reporting questions often point to a fix in another domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  How should you split 180 minutes and your study weeks?
&lt;/h2&gt;

&lt;p&gt;On exam day you have 2.4 minutes per question, which is generous. The bigger risk is the pass mark. Fifty out of 75 is about 67%, so you can miss 25 questions, but not by skipping whole domains.&lt;/p&gt;

&lt;p&gt;Study by weight and by stop. Spend the first block on Stops 1 to 3, which carry about 68% of the exam between them, and build each setting in a free Jira Service Management Cloud site rather than only reading about it. Then cover automation, context and the knowledge base, and finish with reporting.&lt;/p&gt;

&lt;p&gt;When you want to test yourself, a set of &lt;a href="https://www.certfun.com/atlassian/atlassian-managing-jira-service-projects-cloud-acp-420-certification-sample-questions" rel="noopener noreferrer"&gt;free ACP-420 sample questions&lt;/a&gt; shows how Atlassian phrases its scenarios. Read the explanation for every miss, then rebuild that setting in your test site.&lt;/p&gt;

&lt;p&gt;Atlassian also offers a free on-demand collection to &lt;a href="https://community.atlassian.com/learning/collection/topic/become-an-effective-jira-service-management-project-admin" rel="noopener noreferrer"&gt;become an effective Jira Service Management project admin&lt;/a&gt;, which follows the same admin tasks this exam measures.&lt;/p&gt;

&lt;p&gt;If you are still new to the agent side of service management, this short CertFun video on the related ACA-925 agent exam is a quick refresher on how agents work tickets before you configure the project around them.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/NNNik0K1iAA" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The agent-level exam has its own &lt;a href="https://www.certfun.com/blog/aca-925-preparation-guide-jira-service-management-agent-essentials" rel="noopener noreferrer"&gt;ACA-925 blueprint guide&lt;/a&gt;, which is a sensible first step if you have never worked a queue yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. How many questions are on the ACP-420 exam, and what is the passing score?
&lt;/h3&gt;

&lt;p&gt;The exam has 75 questions and a 180-minute limit. Atlassian states the passing score as 50 correct answers, which is about 67%.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. How much does the ACP-420 exam cost?
&lt;/h3&gt;

&lt;p&gt;Atlassian lists the exam at $249 plus tax. It is delivered online with a remote proctor.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Does ACP-420 cover team-managed projects?
&lt;/h3&gt;

&lt;p&gt;No. The exam covers Jira Service Management Cloud with company-managed projects only, so focus your practice on company-managed service projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. How long is the ACP-420 certification valid?
&lt;/h3&gt;

&lt;p&gt;Atlassian certifications are valid for 24 months. After that you need to renew to keep the credential active.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Which ACP-420 domain should I study first?
&lt;/h3&gt;

&lt;p&gt;Start with configure customer facing features (about 21%), configure agent facing features (about 19%) and users, roles and permissions (about 16%). Together they make up 56% of the exam.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you book
&lt;/h2&gt;

&lt;p&gt;Run the VPN ticket through your own test site one last time: raise it as a customer, watch it land in a queue, let an SLA breach, fire an automation rule, and find it in a report. If every stop behaves the way you expected, you are ready. When you want a timed run first, the &lt;a href="https://www.certfun.com/atlassian/acp-420-atlassian-managing-jira-service-projects-cloud" rel="noopener noreferrer"&gt;ACP-420 practice exam&lt;/a&gt; mirrors the 75-question format.&lt;/p&gt;

</description>
      <category>career</category>
      <category>cloud</category>
      <category>learning</category>
    </item>
    <item>
      <title>Splunk Advanced Power User 1004: A Hands-On SPL Self-Check Before You Book</title>
      <dc:creator>Palak Mazumdar</dc:creator>
      <pubDate>Tue, 06 Oct 2026 04:14:19 +0000</pubDate>
      <link>https://dev.to/palak_mazumdar_f5431445f6/splunk-advanced-power-user-1004-a-hands-on-spl-self-check-before-you-book-3bp</link>
      <guid>https://dev.to/palak_mazumdar_f5431445f6/splunk-advanced-power-user-1004-a-hands-on-spl-self-check-before-you-book-3bp</guid>
      <description>&lt;p&gt;The Splunk Advanced Power User 1004 exam (SPLK-1004) checks whether you can write and tune intermediate-to-advanced SPL and build interactive dashboards. You get 70 multiple-choice questions in 60 minutes for USD 130 per attempt, and you must already hold the Splunk Core Certified Power User badge, according to &lt;a href="https://www.splunk.com/en_us/training/certification-track/splunk-core-certified-advanced-power-user.html" rel="noopener noreferrer"&gt;Splunk's certification track page for the Advanced Power User&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Most guides stop at those numbers. This one doesn't. Below you'll find short searches and dashboard snippets, one for each cluster of the blueprint. If you can explain what each one returns without running it, you're close. If you hesitate, you've found where your study time should go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why can't you skip any topic on SPLK-1004?
&lt;/h2&gt;

&lt;p&gt;You can't skip one because no single topic is big enough to carry you. The &lt;a href="https://www.splunk.com/en_us/pdfs/training/splunk-test-blueprint-advanced-power-user.pdf" rel="noopener noreferrer"&gt;Advanced Power User test blueprint PDF&lt;/a&gt; splits the exam into 22 topics, and the largest of them, multivalued fields and drilldowns, weigh only 7% each. The smallest, Working with Time, is 2%.&lt;/p&gt;

&lt;p&gt;Group the topics and a clearer picture appears. Topics 1.0 to 16.0 (statistics, eval, lookups, alerts, field extraction, acceleration, search tuning, transactions and subsearches) add up to 67%. Topics 17.0 to 22.0 (prototypes, forms, dashboard performance, customization, drilldowns and advanced behaviors) add up to the remaining 33%.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnfv8g5nk2hmlz6y5ghh6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnfv8g5nk2hmlz6y5ghh6.png" alt="SPLK-1004 blueprint drawn as a 22-channel mixing desk: each fader is one topic, set to its exam weight, with search skills on the left bus (67%) and dashboard skills on the right bus (33%)" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The practical takeaway: a candidate who is strong on searching but has never edited Simple XML gives away about a third of the exam. The reverse is just as costly. CertFun lays every subtopic out in one list in its &lt;a href="https://www.certfun.com/splunk/splunk-core-advanced-power-user-exam-syllabus" rel="noopener noreferrer"&gt;SPLK-1004 syllabus with all 22 weighted topics&lt;/a&gt;, which is handy for ticking items off as you go.&lt;/p&gt;

&lt;p&gt;Note: the blueprint says total exam time includes 3 minutes to review the exam agreement, so your real answering time is closer to 57 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you tell eventstats from streamstats at a glance?
&lt;/h2&gt;

&lt;p&gt;You should be able to, because blueprint topic 1.0 lists both, and the difference is a favorite source of distractor answers. Read these two searches and predict the output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index=web sourcetype=access_combined
| eventstats avg(bytes) AS avg_bytes BY host
| where bytes &amp;gt; 2 * avg_bytes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index=web sourcetype=access_combined
| sort 0 _time
| streamstats count AS hit_number BY clientip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first keeps every event, adds the per-host average to each one, then filters to oversized responses. The second numbers each client's hits in time order, so the third request from an IP gets &lt;code&gt;hit_number=3&lt;/code&gt;. Neither one collapses events the way &lt;code&gt;stats&lt;/code&gt; does. If you'd have answered "it returns one row per host" for the first search, revisit the stats family before anything else.&lt;/p&gt;

&lt;p&gt;Prerequisite material matters here. Splunk expects the basics of &lt;code&gt;stats&lt;/code&gt;, &lt;code&gt;timechart&lt;/code&gt; and lookups from the earlier exam, so if those feel rusty, skim the &lt;a href="https://www.certfun.com/splunk/splk-1002-splunk-core-certified-power-user" rel="noopener noreferrer"&gt;Core Certified Power User exam overview&lt;/a&gt; and its topic list first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens to a multivalue field after mvexpand?
&lt;/h2&gt;

&lt;p&gt;Each value becomes its own event, and every other field is copied onto each new event. Multivalued fields (topic 13.0) are one of the two heaviest topics at 7%, so expect several questions here.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| makeresults
| eval recipients="ana@example.com;raj@example.com;li@example.com"
| makemv delim=";" recipients
| mvexpand recipients
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns three results, one per address. Swap the last line for &lt;code&gt;| eval n=mvcount(recipients)&lt;/code&gt; and you get a single result with &lt;code&gt;n=3&lt;/code&gt;. Know the difference between &lt;code&gt;makemv&lt;/code&gt; (splits one string into a multivalue field), &lt;code&gt;mvexpand&lt;/code&gt; (splits one event into many) and the &lt;code&gt;mv*&lt;/code&gt; eval functions (work inside a single event).&lt;/p&gt;

&lt;p&gt;Self-describing data (topic 6.0) is close kin. Try predicting this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| makeresults
| eval payload="{\"user\":{\"id\":42,\"roles\":[\"admin\",\"auditor\"]}}"
| spath input=payload path=user.roles{} output=roles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;roles&lt;/code&gt; comes back as a multivalue field holding &lt;code&gt;admin&lt;/code&gt; and &lt;code&gt;auditor&lt;/code&gt;. The &lt;code&gt;{}&lt;/code&gt; suffix is what tells &lt;code&gt;spath&lt;/code&gt; to walk the array.&lt;/p&gt;

&lt;h2&gt;
  
  
  When does tstats beat a normal search?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;tstats&lt;/code&gt; wins when the data it needs already sits in tsidx files, either indexed fields or an accelerated data model. Topics 8.0, 9.0 and 19.0 all touch acceleration, so this idea pays off three times.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| tstats count FROM datamodel=Web WHERE Web.status=404 BY _time Web.src span=1h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This assumes an accelerated &lt;code&gt;Web&lt;/code&gt; data model. It counts 404s per source per hour without reading raw events, which is why it's fast. Be ready to answer the reverse question too: why does &lt;code&gt;tstats&lt;/code&gt; return nothing for a field that only exists at search time? Because that field was never written to a tsidx file.&lt;/p&gt;

&lt;p&gt;The official &lt;a href="https://www.splunk.com/en_us/training/course-catalog.html?filters=filterGroup2SplunkCoreCertifiedAdvancedPowerUser" rel="noopener noreferrer"&gt;Splunk Advanced Power User learning path&lt;/a&gt; includes Data Models and Search Optimization courses that cover this in depth, and the blueprint names both among its suggested training.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you use a subsearch, a lookup or stats?
&lt;/h2&gt;

&lt;p&gt;Pick the tool that avoids the subsearch whenever the data allows it. Topic 16.0 has a subtopic literally called "When NOT to use subsearch", which tells you how Splunk frames the question.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index=security sourcetype=firewall
    [ search index=threat_intel | fields src_ip | rename src_ip AS dest_ip ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That works, but subsearches have result and runtime limits, so a large threat list can be cut short without warning. If the list is static, a lookup is safer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index=security sourcetype=firewall
| lookup bad_ips ip AS dest_ip OUTPUT threat_level
| where isnotnull(threat_level)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same logic applies to &lt;code&gt;transaction&lt;/code&gt; (topic 14.0). When you only need a start time, an end time and the pages visited per session, &lt;code&gt;stats&lt;/code&gt; is lighter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index=web sourcetype=access_combined
| stats min(_time) AS start max(_time) AS finish values(uri_path) AS pages BY JSESSIONID
| eval duration = finish - start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Search tuning (topic 11.0) rounds this out. &lt;code&gt;index=net TERM(10.0.0.15)&lt;/code&gt; matches the IP as one indexed term instead of breaking it apart at the periods, which is the kind of detail a single question can hinge on. To see how Splunk phrases questions on these trade-offs, work through &lt;a href="https://www.certfun.com/splunk/splunk-core-advanced-power-user-splk-1004-certification-sample-questions" rel="noopener noreferrer"&gt;CertFun's free SPLK-1004 sample questions&lt;/a&gt; and note which ones you got right for the wrong reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you wire a token from a dropdown to a drilldown?
&lt;/h2&gt;

&lt;p&gt;If you can, you've covered most of the dashboard third of the exam. Forms (18.0), drilldowns (21.0) and advanced behaviors (22.0) all depend on tokens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"dropdown"&lt;/span&gt; &lt;span class="na"&gt;token=&lt;/span&gt;&lt;span class="s"&gt;"host_tok"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;Host&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;fieldForLabel&amp;gt;&lt;/span&gt;host&lt;span class="nt"&gt;&amp;lt;/fieldForLabel&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;fieldForValue&amp;gt;&lt;/span&gt;host&lt;span class="nt"&gt;&amp;lt;/fieldForValue&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;search&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;query&amp;gt;&lt;/span&gt;| tstats count WHERE index=web BY host&lt;span class="nt"&gt;&amp;lt;/query&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/search&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/input&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A panel then uses &lt;code&gt;$host_tok$&lt;/code&gt; in its own query. For a drilldown that passes the clicked value to another panel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;drilldown&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;set&lt;/span&gt; &lt;span class="na"&gt;token=&lt;/span&gt;&lt;span class="s"&gt;"clicked_ip"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;$click.value$&lt;span class="nt"&gt;&amp;lt;/set&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/drilldown&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Self-check questions to answer out loud: What's the difference between &lt;code&gt;$click.value$&lt;/code&gt; and &lt;code&gt;$row.&amp;lt;fieldname&amp;gt;$&lt;/code&gt;? How does a base search with post-process searches cut load time (topic 19.0)? How do you make a second dropdown depend on the first (cascading inputs, 18.3)? If any of these stall you, build a small test dashboard on a free Splunk instance and break it on purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch: a quick SPLK-1004 walkthrough
&lt;/h2&gt;

&lt;p&gt;This short CertFun video covers the exam format and how to approach preparation.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/3dBvh459m4s" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How should you plan the last three weeks?
&lt;/h2&gt;

&lt;p&gt;Spend the first two weeks on gaps and the last week on timed practice. A simple split that follows the 67/33 weighting:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;th&gt;Done when you can...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Stats family, eval functions, multivalue fields, spath&lt;/td&gt;
&lt;td&gt;Predict the output of every snippet above without running it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Acceleration, tstats, subsearch limits, transactions, then forms, tokens and drilldowns&lt;/td&gt;
&lt;td&gt;Build a two-input dashboard with a working drilldown from scratch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Timed mixed sets and review of every wrong answer&lt;/td&gt;
&lt;td&gt;Finish 70 questions with time left to flag and revisit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Week 3 is where a &lt;a href="https://www.certfun.com/exam-store/splk-1004-splunk-core-certified-advanced-power-user" rel="noopener noreferrer"&gt;timed SPLK-1004 practice exam&lt;/a&gt; earns its place: it tells you whether your accuracy holds for 70 questions in a row, not just for one snippet at a time.&lt;/p&gt;

&lt;p&gt;Book your seat early so the date anchors the plan. A fixed date turns "I'll study tsidx files eventually" into a week-two task with a deadline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. How many questions are on the Splunk Advanced Power User 1004 exam?
&lt;/h3&gt;

&lt;p&gt;The SPLK-1004 exam has 70 multiple-choice questions and a 60-minute time limit. Splunk's blueprint notes that the 60 minutes include 3 minutes for reviewing the exam agreement.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Do I need the Power User certification before taking SPLK-1004?
&lt;/h3&gt;

&lt;p&gt;Yes. Splunk lists the Splunk Core Certified Power User certification as the prerequisite for the Advanced Power User exam.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Which SPLK-1004 topics carry the most weight?
&lt;/h3&gt;

&lt;p&gt;Working with Multivalued Fields and Adding Drilldowns are the largest topics at 7% each. Most of the other 20 topics sit between 3% and 6%, so breadth matters more than depth in any one area.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. How much does the SPLK-1004 exam cost?
&lt;/h3&gt;

&lt;p&gt;Splunk lists the price as USD 130 per exam attempt. You schedule and pay through &lt;a href="https://www.pearsonvue.com/us/en/splunk.html" rel="noopener noreferrer"&gt;Pearson VUE's Splunk testing page&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Is SPLK-1004 mostly about searching or about dashboards?
&lt;/h3&gt;

&lt;p&gt;Both. Search-related topics (1.0 to 16.0) make up 67% of the blueprint, and dashboard topics (17.0 to 22.0) make up the other 33%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go from here
&lt;/h2&gt;

&lt;p&gt;Run every snippet in this post against your own data, then rewrite it from memory a day later. That second attempt shows you what you actually know, and the gaps it exposes are your study list for the week.&lt;/p&gt;

&lt;p&gt;For a broader roadmap covering courses, community resources and study habits, CertFun's &lt;a href="https://www.certfun.com/blog/how-obtain-splunk-core-certified-advanced-power-user-certification" rel="noopener noreferrer"&gt;step-by-step guide to earning the Advanced Power User certification&lt;/a&gt; picks up where this self-check leaves off.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>ESDP 2025 Esri Exam: How 75 Questions Split Across Four Architecture Domains</title>
      <dc:creator>Palak Mazumdar</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:57:41 +0000</pubDate>
      <link>https://dev.to/palak_mazumdar_f5431445f6/esdp-2025-esri-exam-how-75-questions-split-across-four-architecture-domains-4jna</link>
      <guid>https://dev.to/palak_mazumdar_f5431445f6/esdp-2025-esri-exam-how-75-questions-split-across-four-architecture-domains-4jna</guid>
      <description>&lt;p&gt;The ESDP 2025 Esri exam (code ESDP_2025) is Esri's professional-level test of whether you can design a complete ArcGIS Enterprise system for a client. It has 75 multiple-choice questions, a 1 hour 45 minute time limit and a USD 325 fee, according to &lt;a href="https://www.esri.com/en-us/training/certification/exams/arcgis-enterprise-system-design-professional-2025" rel="noopener noreferrer"&gt;Esri's official ESDP 2025 exam page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That is the short answer. The longer one is that this exam rewards a very specific habit: reading a scenario, spotting the requirement that matters, and turning it into an architecture decision. This post walks through where the questions come from, which tools Esri expects you to know, and how to spend your study hours on the domains that carry the most weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the ESDP 2025 Esri exam actually cover?
&lt;/h2&gt;

&lt;p&gt;The exam covers four domains: Physical Architecture, Solution Architecture, Architectural Concepts, and Deployment and Troubleshooting. Esri lists them, with their weights and every objective, in the &lt;a href="https://community.esri.com/en/discussion/1595301/esdp-2025-eig" rel="noopener noreferrer"&gt;ESDP 2025 Exam Information Guide (January 2026 edition)&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;What it asks you to do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Physical Architecture&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;Document architecture for nonfunctional requirements, design high availability, size server capacity, pick a VDI configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solution Architecture&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;td&gt;Choose ArcGIS components, server roles and extensions, data store types and authentication methods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architectural Concepts&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;Decide on workload separation, environment isolation, collaboration type, content delivery, backup and tiered designs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment and Troubleshooting&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;td&gt;Select an upgrade strategy, find integration issues, read tool output, pick the right ArcGIS Monitor component&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The guide states the exam was published on 13 November 2025, is delivered in English, and is "Available to Public". Esri describes its purpose as testing "the candidate's ability to design an advanced ArcGIS Enterprise system for clients that may include custom solutions for unique projects and use cases using best practices."&lt;/p&gt;

&lt;p&gt;If you want every objective on one page next to study notes, CertFun keeps &lt;a href="https://www.certfun.com/esri/esri-arcgis-enterprise-system-design-professional-exam-syllabus" rel="noopener noreferrer"&gt;a topic-by-topic ESDP_2025 syllabus&lt;/a&gt; that mirrors these four weights.&lt;/p&gt;

&lt;h2&gt;
  
  
  How many questions come from each domain?
&lt;/h2&gt;

&lt;p&gt;Roughly 26 questions come from Physical Architecture, which makes it the single biggest block on the exam. Esri publishes percentages, not question counts, so the numbers below are estimates: each weight multiplied by 75, then rounded so the total stays at 75.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;Approx. questions&lt;/th&gt;
&lt;th&gt;Approx. minutes at an even pace&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Physical Architecture&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;~26&lt;/td&gt;
&lt;td&gt;~36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solution Architecture&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;td&gt;~20&lt;/td&gt;
&lt;td&gt;~28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architectural Concepts&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;~19&lt;/td&gt;
&lt;td&gt;~27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment and Troubleshooting&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;td&gt;~10&lt;/td&gt;
&lt;td&gt;~14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;105&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw35t5ntece953smj0p0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw35t5ntece953smj0p0n.png" alt="Elevation profile of the ESDP 2025 exam: four domain peaks sized by weight, with approximate question counts and a 105-minute time budget" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two numbers are worth remembering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;84 seconds per question.&lt;/strong&gt; 105 minutes spread over 75 questions works out to 84 seconds each. Scenario questions take longer to read, so bank time on the short recall items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;61% of the exam is Physical plus Solution Architecture.&lt;/strong&gt; If your study time is limited, those two domains decide the result.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who is the ESDP exam really written for?
&lt;/h2&gt;

&lt;p&gt;It is written for people who already design ArcGIS Enterprise systems for a living. Esri expects "at least 4 years of applied experience with ArcGIS Enterprise system design", and names GIS administrators, GIS managers, GIS consultants and enterprise architects as typical candidates.&lt;/p&gt;

&lt;p&gt;The guide also lists what a qualified candidate should be able to do. A few of those tasks show how practical the exam is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translate functional and nonfunctional requirements into a solution and system design&lt;/li&gt;
&lt;li&gt;Design an ArcGIS Enterprise system for high availability and disaster recovery&lt;/li&gt;
&lt;li&gt;Calculate system capacity and determine licensing requirements&lt;/li&gt;
&lt;li&gt;Design architectures for cloud and virtualized environments, including virtual desktop infrastructure (VDI)&lt;/li&gt;
&lt;li&gt;Identify and troubleshoot infrastructure issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the verbs: design, calculate, determine. This is not a feature-recall test. Most questions hand you a client situation and ask for the decision a senior architect would make.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which tools should you know before exam day?
&lt;/h2&gt;

&lt;p&gt;Esri names eight products and tool types a candidate should be familiar with. Knowing what each one outputs, and when you would reach for it, covers a good part of the Deployment and Troubleshooting domain.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ArcGIS Enterprise 11.4&lt;/strong&gt;, the release the exam is written against&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ArcGIS Monitor 2024.x&lt;/strong&gt;, for health and usage monitoring of the deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GIS Enterprise Reporter&lt;/strong&gt;, for documenting what a deployment contains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System Log Parser&lt;/strong&gt;, for turning ArcGIS Server logs into usage and performance reports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;eGDB Health&lt;/strong&gt;, for checking enterprise geodatabase condition&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network tracing tools&lt;/strong&gt;, such as Fiddler and browser DevTools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure troubleshooting tools&lt;/strong&gt;, such as Process Monitor and Sysmon&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command-line shells&lt;/strong&gt;, such as CMD, PowerShell and Shell&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If 11.4 isn't the version you run at work, spend an evening in the 11.4 release of the ArcGIS Enterprise documentation checking how its components fit together, so the exam's terminology matches yours.&lt;/p&gt;

&lt;p&gt;The guide is just as clear about what it leaves out. Advising on complex security architecture patterns, complex load balancer configurations and complex networking are all listed as beyond the qualified candidate. Expect load balancers and authentication in your scenarios, but at the level of "which approach fits", not deep configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  How should you study each ESDP domain?
&lt;/h2&gt;

&lt;p&gt;Study each domain the way it is examined: start from a requirement and work out the design. Here is a domain-by-domain plan, ordered by weight.&lt;/p&gt;

&lt;h3&gt;
  
  
  Physical Architecture (35%)
&lt;/h3&gt;

&lt;p&gt;This domain tests whether you can turn requirements into machines, tiers and URLs. Practise four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sizing server capacity from given system design inputs (users, requests, service types)&lt;/li&gt;
&lt;li&gt;Designing a highly available deployment, and knowing which components need redundancy&lt;/li&gt;
&lt;li&gt;Identifying the URLs ArcGIS Enterprise uses, including portal, server and web adaptor endpoints&lt;/li&gt;
&lt;li&gt;Choosing a VDI configuration for a stated scenario&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esri's &lt;a href="https://architecture.arcgis.com/en/" rel="noopener noreferrer"&gt;ArcGIS Architecture Center&lt;/a&gt; publishes reference architectures and best-practice patterns. It's one of the most direct ways to see how Esri itself documents a physical design.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution Architecture (26%)
&lt;/h3&gt;

&lt;p&gt;Here the question is "which pieces does this design need?" Build a one-page matrix of ArcGIS Server roles and extensions, the data store types and what each is for, and the authentication options with the business need each one answers. When a scenario mentions a constraint, such as budget, a single site or no cloud, check whether it rules out a component before you pick an answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architectural Concepts (25%)
&lt;/h3&gt;

&lt;p&gt;This domain is about judgement calls: when to separate workloads, how to isolate environments (development, staging, production), which collaboration type suits two organizations, how to deliver content, and when a tiered architecture is worth its complexity. For each concept, write down one situation where you would use it and one where you would not. The exam's scenarios usually sit right on that line.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment and Troubleshooting (14%)
&lt;/h3&gt;

&lt;p&gt;It's the smallest domain, but the most tool-driven. Know the upgrade strategies and the trade-offs of each. Practise reading output from the tools listed above, and be able to say which ArcGIS Monitor component answers a given question.&lt;/p&gt;

&lt;p&gt;Esri also maintains a list of &lt;a href="https://community.esri.com/en/discussion/1273542/esri-exam-preparation-resources" rel="noopener noreferrer"&gt;general exam preparation resources&lt;/a&gt; for all its certifications. It's worth a quick scan before you build your study plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is there a quick video overview of the ESDP exam?
&lt;/h2&gt;

&lt;p&gt;Yes. CertFun's video on the ESDP_2025 exam is a quick way to get oriented before you open the guide itself.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/9glawq2NU4o" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you book and sit the ESDP_2025 exam?
&lt;/h2&gt;

&lt;p&gt;You book it through Pearson VUE. &lt;a href="https://www.pearsonvue.com/us/en/esri.html" rel="noopener noreferrer"&gt;Pearson VUE's Esri exam page&lt;/a&gt; offers both a test center search and OnVUE online testing, and it asks candidates to read Esri's program agreement and policies before registering.&lt;/p&gt;

&lt;p&gt;A few practical points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schedule your date first, then plan backwards. A fixed date makes a study plan real.&lt;/li&gt;
&lt;li&gt;If you test online, run the system check on the same computer and network you will use on exam day.&lt;/li&gt;
&lt;li&gt;Plan for the 84-second pace. Flag long scenario questions, answer everything you're sure of, then come back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do you know when you're ready?
&lt;/h2&gt;

&lt;p&gt;You're ready when you can explain why the wrong options are wrong, not just pick the right one. Domain-weighted practice is the quickest way to find out.&lt;/p&gt;

&lt;p&gt;Start with these &lt;a href="https://www.certfun.com/esri/esri-arcgis-enterprise-system-design-professional-esdp-2025-certification-sample-questions" rel="noopener noreferrer"&gt;free ESDP sample questions&lt;/a&gt; to get a feel for how Esri phrases a scenario.&lt;/p&gt;

&lt;p&gt;When those feel comfortable, a &lt;a href="https://www.certfun.com/exam-store/esdp-2025-esri-arcgis-enterprise-system-design-professional-2025" rel="noopener noreferrer"&gt;timed ESDP_2025 practice exam&lt;/a&gt; shows whether you can hold the 84-second pace across a full 75-question run, and which domain drags your score down.&lt;/p&gt;

&lt;p&gt;For the exam summary, fee and booking details in one place, keep &lt;a href="https://www.certfun.com/esri/esdp-2025-esri-arcgis-enterprise-system-design-professional-2025" rel="noopener noreferrer"&gt;CertFun's ESDP 2025 exam overview&lt;/a&gt; bookmarked while you study.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. How many questions are on the ESDP 2025 Esri exam?
&lt;/h3&gt;

&lt;p&gt;The ESDP_2025 exam has 75 multiple-choice questions and a time limit of 1 hour 45 minutes (105 minutes), according to Esri's Exam Information Guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. How much does the ESDP_2025 exam cost?
&lt;/h3&gt;

&lt;p&gt;Esri lists the ArcGIS Enterprise System Design Professional 2025 exam at USD 325.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. How much experience do I need for ESDP 2025?
&lt;/h3&gt;

&lt;p&gt;Esri recommends at least 4 years of applied experience with ArcGIS Enterprise system design. It's a recommendation, not a formal prerequisite, but the scenario questions assume that level of hands-on work.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Which ArcGIS Enterprise version does the ESDP 2025 exam use?
&lt;/h3&gt;

&lt;p&gt;The Exam Information Guide says candidates should be familiar with ArcGIS Enterprise 11.4 and ArcGIS Monitor 2024.x, along with tools such as GIS Enterprise Reporter, System Log Parser and eGDB Health.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Which ESDP domain carries the most weight?
&lt;/h3&gt;

&lt;p&gt;Physical Architecture carries the most weight at 35%, or about 26 of the 75 questions. Solution Architecture (26%) and Architectural Concepts (25%) follow, and Deployment and Troubleshooting is 14%.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>career</category>
      <category>learning</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Delta Lake ACID vs Apache Spark DataFrames: What the Databricks Data Engineer Exam Really Tests</title>
      <dc:creator>Palak Mazumdar</dc:creator>
      <pubDate>Tue, 29 Sep 2026 09:46:05 +0000</pubDate>
      <link>https://dev.to/palak_mazumdar_f5431445f6/delta-lake-acid-vs-apache-spark-dataframes-what-the-databricks-data-engineer-exam-really-tests-4h66</link>
      <guid>https://dev.to/palak_mazumdar_f5431445f6/delta-lake-acid-vs-apache-spark-dataframes-what-the-databricks-data-engineer-exam-really-tests-4h66</guid>
      <description>&lt;p&gt;The Databricks Certified Data Engineer Associate exam does not test whether you can memorize PySpark DataFrame functions. It tests whether you can guarantee data integrity, automated recovery, and governed access across an end-to-end Lakehouse pipeline using Delta Lake and Unity Catalog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does the Databricks Associate exam catch experienced Python developers off guard?
&lt;/h2&gt;

&lt;p&gt;Many engineers prepare for this certification expecting a standard PySpark coding assessment. They spend weeks practicing complex &lt;code&gt;groupBy()&lt;/code&gt;, &lt;code&gt;window()&lt;/code&gt;, and &lt;code&gt;join()&lt;/code&gt; operations, only to find on exam day that syntax is barely a third of the battle. The exam questions focus relentlessly on statefulness: what happens when an ingestion job fails halfway through, how the &lt;code&gt;_delta_log&lt;/code&gt; prevents duplicate records, and why schema mismatch behaves differently between batch appends and streaming sources.&lt;/p&gt;

&lt;p&gt;In standard Apache Spark, files written to object storage (like AWS S3 or Azure ADLS Gen2) lack atomic commit guarantees out of the box. A job failure leaves half-written Parquet files that corrupt downstream tables. Delta Lake solves this with an ACID transaction log, and understanding how that log evaluates transactions is what separates a passing score from a retake.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does the Delta Lake transaction log work under the hood?
&lt;/h2&gt;

&lt;p&gt;Delta Lake tables are fundamentally Parquet data files paired with an ordered transaction log directory named &lt;code&gt;_delta_log/&lt;/code&gt;. Every time a commit occurs, whether an &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;, or &lt;code&gt;MERGE&lt;/code&gt;, Delta Lake writes a new JSON commit file (&lt;code&gt;000000.json&lt;/code&gt;, &lt;code&gt;000001.json&lt;/code&gt;, etc.) documenting exactly which files were added and which were marked as removed.&lt;/p&gt;

&lt;p&gt;A typical Delta Lake &lt;code&gt;MERGE INTO&lt;/code&gt; operation illustrates how this state is tracked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;MERGE&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;silver_customers&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;
&lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;bronze_customer_updates&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;
&lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;MATCHED&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'INACTIVE'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
  &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;current_timestamp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;MATCHED&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
  &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;full_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_active&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;current_timestamp&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;current_timestamp&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice what happens physically on disk. Delta Lake does not modify existing Parquet files in place. It writes brand new Parquet files containing the updated rows and the unchanged rows from affected files, then writes a new JSON commit file stating that the old files are superseded. Readers querying the table see a consistent snapshot because they only read files declared valid by the latest commit.&lt;/p&gt;

&lt;p&gt;This mechanism powers two essential exam topics: Time Travel and Table Optimization. You can query past snapshots using &lt;code&gt;SELECT * FROM silver_customers VERSION AS OF 12&lt;/code&gt; without restoring backups. Running &lt;code&gt;OPTIMIZE silver_customers ZORDER BY (customer_id)&lt;/code&gt; compacts many small files into fewer, larger ones to speed up reads, while &lt;code&gt;VACUUM&lt;/code&gt; removes files that are no longer referenced once they pass the retention threshold (7 days by default).&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes Auto Loader different from standard structured streaming?
&lt;/h2&gt;

&lt;p&gt;Ingesting streaming and batched files from cloud storage is worth 21% of the exam weight. Standard Spark &lt;code&gt;readStream&lt;/code&gt; over cloud directories struggles when millions of files arrive because scanning directory trees triggers rate limits and high metadata overhead. Databricks Auto Loader (&lt;code&gt;cloudFiles&lt;/code&gt;) solves this by offering two distinct modes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Directory Listing Mode:&lt;/strong&gt; Periodically lists the storage path and tracks which files it has already processed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Notification Mode:&lt;/strong&gt; Uses cloud notification services (such as AWS SQS/SNS or Azure Event Grid) to receive file-arrival events directly, bypassing directory scans entirely.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Auto Loader also introduces automatic schema inference and schema evolution, plus the crucial &lt;code&gt;_rescued_data&lt;/code&gt; column:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readStream&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cloudFiles&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cloudFiles.format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cloudFiles.schemaLocation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/checkpoints/bronze_orders/schema&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cloudFiles.inferColumnTypes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/mnt/raw_data/orders/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an upstream system suddenly passes a string inside a numeric field, Auto Loader does not crash your streaming pipeline. It writes the malformed payload into &lt;code&gt;_rescued_data&lt;/code&gt;, allowing the rest of the stream to process cleanly while isolating bad records for review.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy49809upqbuquh4zdk0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy49809upqbuquh4zdk0h.png" alt="Landscape infographic of the seven Databricks Data Engineer Associate exam domains and their May 2026 weights" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How has the May 2026 exam guide changed domain weights?
&lt;/h2&gt;

&lt;p&gt;According to &lt;a href="https://www.databricks.com/learn/certification/data-engineer-associate" rel="noopener noreferrer"&gt;the official Databricks Data Engineer Associate certification page&lt;/a&gt;, the exam follows a May 2026 exam guide. Its 45 scored questions are distributed across seven domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Transformation and Modeling (22%):&lt;/strong&gt; Cleaning, deduplication, higher-order SQL functions, and PySpark DataFrame manipulation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Ingestion and Loading (21%):&lt;/strong&gt; Auto Loader, &lt;code&gt;COPY INTO&lt;/code&gt;, Delta Lake table creation, and streaming checkpointing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working with Lakeflow Jobs (16%):&lt;/strong&gt; Multi-task job authoring, parameter passing, failure retries, and task dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance and Security (15%):&lt;/strong&gt; Unity Catalog three-level namespaces (&lt;code&gt;catalog.schema.table&lt;/code&gt;), grant propagation, and data lineage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Troubleshooting, Monitoring, and Optimization (10%):&lt;/strong&gt; Cluster driver/executor bottlenecks, &lt;code&gt;OPTIMIZE&lt;/code&gt;, caching, and Spark UI metrics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementing CI/CD (10%):&lt;/strong&gt; Databricks Asset Bundles, Git folder integration, and automated deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Databricks Intelligence Platform (6%):&lt;/strong&gt; Core lakehouse concepts and platform architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get 90 minutes for those 45 questions, taken online or at a test center. Because the questions are scenario-driven, memorizing definitions is not enough. Working through &lt;a href="https://www.certfun.com/databricks/databricks-data-engineer-associate-certification-sample-questions" rel="noopener noreferrer"&gt;free Data Engineer Associate sample questions&lt;/a&gt; shows how streaming checkpoint and multi-table join scenarios tend to be phrased.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which study area provides the highest ROI before exam day?
&lt;/h2&gt;

&lt;p&gt;Focus your preparation on the intersection of Data Transformation (22%) and Governance and Security (15%). Unity Catalog is no longer an optional add-on; it is the default security and metadata layer. You must understand how privileges cascade from catalog to schema to table, and how Unity Catalog controls access to external locations.&lt;/p&gt;

&lt;p&gt;Pacing matters as much as knowledge. Ninety minutes across 45 questions leaves two minutes per item, so pipeline debugging logic must feel automatic before you sit the proctored exam. Once PySpark transformations and Unity Catalog grants feel solid, a full timed run on &lt;a href="https://www.certfun.com/databricks/databricks-certified-data-engineer-associate" rel="noopener noreferrer"&gt;CertFun's Data Engineer Associate practice exam page&lt;/a&gt; tells you whether your pacing holds up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want a quick overview before you start?
&lt;/h2&gt;

&lt;p&gt;This two-minute video from CertFun walks through what the Data Engineer Associate exam covers and where to find preparation resources.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/vc-ATq2MJ2Y" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. How many questions are on the Databricks Data Engineer Associate exam?
&lt;/h3&gt;

&lt;p&gt;The exam has 45 scored questions, according to the official Databricks certification page, and they are spread across seven domains.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. How long is the exam and where can I take it?
&lt;/h3&gt;

&lt;p&gt;You have 90 minutes. Databricks offers the exam online with a proctor or at a test center, and the registration fee is $200.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. What is the difference between Delta Lake and standard Parquet?
&lt;/h3&gt;

&lt;p&gt;Delta Lake stores data in Parquet files but adds a transaction log (&lt;code&gt;_delta_log/&lt;/code&gt;). That log provides ACID transactions, scalable metadata handling, time travel, and safe concurrent reads and writes that raw Parquet lacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. How does Auto Loader handle unexpected schema changes?
&lt;/h3&gt;

&lt;p&gt;Auto Loader captures unexpected or mismatched data types in a &lt;code&gt;_rescued_data&lt;/code&gt; column rather than throwing a runtime error. The stream keeps running while the bad records are kept for debugging.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. How long is the Databricks Certified Data Engineer Associate certification valid?
&lt;/h3&gt;

&lt;p&gt;The certification is valid for two years. To stay certified, you must take and pass the current version of the exam.&lt;/p&gt;

</description>
      <category>databricks</category>
      <category>dataengineering</category>
      <category>spark</category>
      <category>certification</category>
    </item>
    <item>
      <title>DAX Filter Context vs Tableau LOD: What PL-300 and DA-201 Really Test</title>
      <dc:creator>Palak Mazumdar</dc:creator>
      <pubDate>Mon, 28 Sep 2026 09:24:52 +0000</pubDate>
      <link>https://dev.to/palak_mazumdar_f5431445f6/dax-filter-context-vs-tableau-lod-what-pl-300-and-da-201-really-test-28k7</link>
      <guid>https://dev.to/palak_mazumdar_f5431445f6/dax-filter-context-vs-tableau-lod-what-pl-300-and-da-201-really-test-28k7</guid>
      <description>&lt;p&gt;PL-300 tests whether you can predict what DAX's filter and row context will do before you run a measure. Analytics-DA-201 tests whether you can predict what Tableau's fixed order of operations will do before you build a calculation. Same job title, two different calculation engines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do these two exams feel so different to prepare for?
&lt;/h2&gt;

&lt;p&gt;Both PL-300 and Analytics-DA-201 get sold as "BI analyst" certifications, so it's tempting to assume the underlying skills transfer. They don't, not fully. Power BI evaluates every measure inside a context that shifts as filters are applied and modified. Tableau evaluates every calculation inside a fixed pipeline where the order literally never changes. Once you internalize that difference, most of what separates the two exams stops being about tool familiarity and starts being about which mental model you're running.&lt;/p&gt;

&lt;p&gt;That distinction shows up in your first non-trivial formula. A DAX measure that works on one report page can return a different number on another, because the filter context around it changed. A Tableau FIXED expression, by contrast, ignores ordinary dimension filters on the dashboard. Only filters that run earlier in the pipeline (extract, data source or context filters) change its result. Neither behavior is a bug. Both are the exam's actual subject matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is DAX filter context, and why does PL-300 lean on it?
&lt;/h2&gt;

&lt;p&gt;DAX evaluates in two contexts: row context, which exists as a formula moves row by row through a table, and filter context, which is the set of filters currently narrowing your data — from slicers, visuals, and relationships. CALCULATE is the function that modifies filter context, and it's the hinge that almost every intermediate DAX pattern turns on. According to &lt;a href="https://learn.microsoft.com/en-us/credentials/certifications/resources/study-guides/pl-300" rel="noopener noreferrer"&gt;the official PL-300 study guide&lt;/a&gt;, the April 2026 objective list explicitly calls out CALCULATE, time-intelligence measures, calculation groups, and visual calculations — all of which are really just different flavors of "manipulate the filter context correctly."&lt;/p&gt;

&lt;p&gt;A simple time-intelligence pattern shows the idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sales YTD =
CALCULATE (
    SUM ( Sales[Amount] ),
    DATESYTD ( 'Date'[Date] )
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CALCULATE takes whatever filter context already exists on the visual, then layers &lt;code&gt;DATESYTD&lt;/code&gt; on top of it to override the date filter specifically. Get the layering order wrong and the measure returns a number that looks plausible but is quietly incorrect — which is exactly the kind of trap PL-300 questions are built around.&lt;/p&gt;

&lt;p&gt;Calculation groups extend the same idea: instead of writing a separate CALCULATE-wrapped measure for every time comparison, you define one reusable set of context modifications and apply it across many base measures. Visual calculations, the newer objective, apply logic directly on top of what's already rendered rather than recomputing from the underlying table — still, fundamentally, filter-context manipulation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Tableau's order of operations, and why does DA-201 lean on it?
&lt;/h2&gt;

&lt;p&gt;Tableau calculations don't shift with context the way DAX does. They run through a fixed pipeline every time: extract filters, then data source filters, then context filters, then FIXED-level-of-detail and Top N filters, then dimension filters, then INCLUDE/EXCLUDE level-of-detail expressions, then measure filters, and finally table calculations. That order is baked into Tableau's documentation, and it's non-negotiable — a FIXED calculation will always ignore a filter that runs later in the pipeline unless that filter is explicitly promoted to a context filter.&lt;/p&gt;

&lt;p&gt;A minimal FIXED expression:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;FIXED&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Region&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Sales&lt;/span&gt;&lt;span class="p"&gt;])}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That expression totals sales by region regardless of most filters on the view, because FIXED evaluates before dimension filters and measure filters are applied. If a question on the exam shows a FIXED calculation "not responding" to a filter, the fix almost always lives in that ordering, not in the syntax.&lt;/p&gt;

&lt;p&gt;INCLUDE and EXCLUDE level-of-detail expressions sit later in the same pipeline, after FIXED and Top N but before measure filters, and they adjust the level of detail relative to whatever's already on the view rather than fixing it absolutely. Mixing up FIXED with INCLUDE/EXCLUDE is one of the most common Tableau mistakes, and it's a mistake you can only reason your way out of if you have the eight-step order memorized rather than half-remembered.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftssdf8i6jaz19k009mr6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftssdf8i6jaz19k009mr6.png" alt="Landscape diagram of Tableau's eight-step order of operations" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How do the two exams weight this material differently?
&lt;/h2&gt;

&lt;p&gt;PL-300's four domains sit close together: preparing data and modeling data each carry 25–30%, visualizing and analyzing data carries another 25–30%, and managing and securing Power BI carries 15–20%. Nothing dominates. Analytics-DA-201 is the opposite. Connect to and Transform Data is 24%, Create Content is 26%, Publish and Manage Content is only 9%, and Explore and Analyze Data — the domain where LOD expressions and order-of-operations questions live — is 41% on its own. If you're prepping for the Tableau exam, that single number should tell you where to spend most of your study hours.&lt;/p&gt;

&lt;p&gt;Once the order of operations feels solid, test it under a clock. &lt;a href="https://www.analyticsexam.com/salesforce/analytics-da-201-salesforce-tableau-data-analyst" rel="noopener noreferrer"&gt;AnalyticsExam's Tableau Data Analyst exam page&lt;/a&gt; has timed practice built on the same four domains, which shows quickly whether the 41% section is still your weak spot.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do the exam formats actually look like?
&lt;/h2&gt;

&lt;p&gt;PL-300 runs 100 minutes and is proctored, with the possibility of interactive, in-product-style components rather than pure multiple choice. Passing requires a scaled score of 700 or higher on Microsoft's 1–1000 scale. It is not a percentage, so don't try to convert it. Analytics-DA-201 runs 105 minutes, is entirely 60 multiple-choice and multiple-select questions plus up to five unscored questions, and requires 65% to pass, proctored either at a test center or online, per &lt;a href="https://help.salesforce.com/s/articleView?id=005298984&amp;amp;language=en_US&amp;amp;type=1" rel="noopener noreferrer"&gt;Salesforce's published exam guide&lt;/a&gt;.&lt;br&gt;
If you want five tips aimed specifically at the Tableau side of this, here's a short video walkthrough:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/gOihPtHiGk8" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Which skill should you drill first?
&lt;/h2&gt;

&lt;p&gt;If you're on the PL-300 track, drill CALCULATE and time-intelligence patterns until modifying filter context feels automatic, then move on to calculation groups and visual calculations — those are the newer, less intuitive objectives as of the April 2026 update. If you're on the Analytics-DA-201 track, memorize the eight-step order of operations cold. It's not exciting to rehearse, but it explains nearly every "why won't my calculation update" scenario you'll hit both on the exam and in real dashboards. Then check yourself against &lt;a href="https://www.analyticsexam.com/salesforce/salesforce-tableau-data-analyst-analytics-da-201-certification-exam-sample-questions" rel="noopener noreferrer"&gt;a batch of free sample questions&lt;/a&gt; to see how that ordering gets framed in exam wording.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What's the difference between DAX row context and filter context?
&lt;/h3&gt;

&lt;p&gt;Row context is the context that exists as a DAX formula moves row by row through a table, while filter context is the set of filters currently narrowing your data from slicers, visuals, and relationships. PL-300 expects you to reason about both.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does CALCULATE actually do in DAX?
&lt;/h3&gt;

&lt;p&gt;CALCULATE modifies the filter context around a measure, layering new filters on top of whatever context already exists on the visual. It's the function almost every intermediate DAX pattern, including time-intelligence measures, is built around.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a FIXED level-of-detail expression in Tableau?
&lt;/h3&gt;

&lt;p&gt;A FIXED expression computes a value at a level of detail you set explicitly, regardless of most filters on the view. It evaluates early in Tableau's order of operations, before dimension and measure filters are applied.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does a Tableau FIXED calculation sometimes ignore a filter?
&lt;/h3&gt;

&lt;p&gt;It's a matter of pipeline order, not a bug. FIXED runs before dimension filters and measure filters, so only filters that run earlier — extract, data source, or context filters — can change its result.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do PL-300's exam domains carry equal weight?
&lt;/h3&gt;

&lt;p&gt;Mostly, yes. Preparing, modeling, and visualizing and analyzing data each carry 25–30%, and managing and securing Power BI carries 15–20% — no single domain dominates the way Explore and Analyze Data does on Analytics-DA-201.&lt;/p&gt;

&lt;p&gt;Both exams are ultimately testing the same underlying instinct: can you predict what a calculation engine will do before you press run. DAX asks you to track a context that moves. Tableau asks you to track a pipeline that doesn't. Learn which one your next project actually needs, and study that engine specifically instead of splitting your attention across both.&lt;/p&gt;

&lt;p&gt;Write out both patterns from memory a few times before your exam date — a CALCULATE measure with a modified filter, and a FIXED expression next to an INCLUDE or EXCLUDE version of the same idea. If you can explain out loud why each one returns the number it does, you've already covered the part of either exam that trips up the most candidates.&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>tableau</category>
      <category>dax</category>
      <category>certification</category>
    </item>
    <item>
      <title>Pass HCL-BF-PRO-11: Your Ultimate Exam Success Plan</title>
      <dc:creator>Palak Mazumdar</dc:creator>
      <pubDate>Mon, 27 Jul 2026 09:30:10 +0000</pubDate>
      <link>https://dev.to/palak_mazumdar_f5431445f6/pass-hcl-bf-pro-11-your-ultimate-exam-success-plan-118i</link>
      <guid>https://dev.to/palak_mazumdar_f5431445f6/pass-hcl-bf-pro-11-your-ultimate-exam-success-plan-118i</guid>
      <description>&lt;p&gt;HCL-BF-PRO-11, the HCLSoftware U Certified Professional - BigFix Platform 11 exam, is specifically designed to validate an IT professional's comprehensive expertise in managing and optimizing the HCL BigFix Platform 11. This certification is critical for system administrators, security engineers, and IT specialists responsible for endpoint management, security compliance, and patch deployment within enterprise environments. Earning this credential confirms your ability to plan, install, configure, administer, and troubleshoot BigFix Platform 11 effectively, demonstrating a high level of operational proficiency. This article provides a comprehensive success plan, outlining key preparation strategies, syllabus insights, and practical tips to help you conquer the HCL-BF-PRO-11 exam with confidence and achieve professional recognition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding HCL-BF-PRO-11 Certification Essentials
&lt;/h2&gt;

&lt;p&gt;The HCL-BF-PRO-11 certification validates advanced skills in endpoint management using HCL BigFix Platform 11, a powerful solution for managing and securing diverse endpoints. This professional credential establishes you as a competent practitioner capable of leveraging BigFix for critical IT operations. Professionals pursuing this certification are typically tasked with maintaining system integrity, ensuring software compliance, and responding to security threats across a wide array of devices. Understanding the exam's core structure and administrative details is the first step toward effective preparation.&lt;br&gt;
Here’s a breakdown of the key parameters for the HCL-BF-PRO-11 exam:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Exam Name:&lt;/strong&gt; HCLSoftware U Certified Professional - BigFix Platform 11&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Exam Code:&lt;/strong&gt; HCL-BF-PRO-11&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Exam Price:&lt;/strong&gt; $150 (USD)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Duration:&lt;/strong&gt; 75 minutes&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Number of Questions:&lt;/strong&gt; 60&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Passing Score:&lt;/strong&gt; 78%
This structured format means candidates must not only possess broad knowledge but also apply it efficiently under timed conditions. Each question contributes to the overall score, making a thorough understanding of all topics crucial. For an extensive overview of the exam's scope and requirements, refer to the &lt;strong&gt;official exam guide&lt;/strong&gt; provided by HCLSoftware. This document offers detailed insights into the exam objectives and structure.
## Navigating the HCL BigFix Platform 11 Syllabus Domains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj3la3n7j9520fti0yqst.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj3la3n7j9520fti0yqst.png" alt=" " width="800" height="537"&gt;&lt;/a&gt;&lt;br&gt;
Success in the HCL-BF-PRO-11 exam hinges on a deep understanding of its five core domains, each weighted differently to reflect its importance in real-world BigFix deployments. These domains cover the entire lifecycle of BigFix implementation and ongoing management, from initial architectural planning to daily operations and critical troubleshooting. A balanced approach to studying these areas is vital for comprehensive readiness.&lt;br&gt;
The examination syllabus focuses on the following key topics and their respective weightings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Planning &amp;amp; Architecture - 20%:&lt;/strong&gt; This section assesses your ability to design and plan a BigFix deployment that meets an organization's specific requirements. It includes understanding infrastructure components, scalability considerations, network topology, and database planning. Knowledge of client-server communication, relay architecture, and best practices for high availability are paramount here.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Installation &amp;amp; Configuration - 20%:&lt;/strong&gt; This domain covers the practical steps of setting up the BigFix environment. Candidates should be proficient in installing BigFix servers, relays, and clients across various operating systems. It also includes configuring initial settings, security certificates, and integrating with existing directories like LDAP or Active Directory for user management. Proper configuration ensures the platform operates securely and efficiently from day one.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Administration &amp;amp; Management - 25%:&lt;/strong&gt; As the largest portion of the exam, this section delves into the day-to-day operational tasks. This includes managing endpoints, deploying custom Fixlets and tasks, handling software distribution, and monitoring compliance. A strong grasp of role-based access control, managing sites, and understanding BigFix content deployment mechanisms is crucial. Effective administration ensures the platform continuously delivers value.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance Tuning &amp;amp; Troubleshooting - 15%:&lt;/strong&gt; This domain tests your ability to maintain optimal BigFix performance and resolve issues efficiently. It covers identifying bottlenecks, optimizing server and database settings, and diagnosing common client and relay problems. Understanding log files, diagnostic tools, and command-line utilities is essential for effective troubleshooting.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Operations &amp;amp; Usage - 20%:&lt;/strong&gt; This final domain focuses on the practical application of BigFix in an operational context. It involves using BigFix for patch management, security vulnerability remediation, software license monitoring, and reporting. Candidates need to demonstrate proficiency in creating reports, automating tasks, and leveraging the platform for endpoint compliance and data management.
Each domain requires not just theoretical knowledge but also an understanding of how these concepts are applied in practical scenarios, which the exam aims to evaluate. Exploring the*&lt;em&gt;official HCLSoftware U page&lt;/em&gt;* will provide further context and resources for these syllabus areas.
## Devising a Robust HCL-BF-PRO-11 Preparation Roadmap
Achieving the HCL-BF-PRO-11 certification demands a structured and comprehensive preparation approach. It's not merely about memorizing facts, but about building a deep, practical understanding of the BigFix Platform 11. Your roadmap should integrate various learning resources and methodologies to ensure all syllabus domains are thoroughly covered. Begin by accessing the foundational resources and then gradually delve into more interactive and practical study methods.
A strong preparation plan typically includes:&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Official Training Courses:&lt;/strong&gt; HCLSoftware U offers specific training designed to prepare candidates for the BigFix Platform 11 certification. These courses provide structured learning paths, often including hands-on labs and expert instruction, which are invaluable for grasping complex concepts. Details on available programs can be found on the &lt;strong&gt;HCL BigFix training programs&lt;/strong&gt; page.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Study Guide Utilization:&lt;/strong&gt; While no single official study guide exists, compiling your own based on the syllabus and official documentation is highly effective. Organize information, create summaries, and highlight key concepts for each domain. This active learning approach reinforces understanding.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Practice Questions and Mock Exams:&lt;/strong&gt; Engaging with practice questions is vital for understanding the exam's style and identifying areas where your knowledge is weak. Certfun offers resources that can aid in this process, providing scenarios similar to what you might encounter. This practice helps refine your test-taking skills and manage time effectively.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Hands-on Lab Experience:&lt;/strong&gt; BigFix is a hands-on platform. Setting up a personal lab environment or utilizing virtual labs to practice installations, configurations, and administrative tasks is indispensable. This practical application solidifies theoretical knowledge and builds confidence. For useful technical insights and community discussions, consider exploring the*&lt;em&gt;BigFix Wiki resources&lt;/em&gt;*.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Leveraging Official Documentation:&lt;/strong&gt; The extensive BigFix documentation is your primary source of accurate information. Dive deep into product manuals, release notes, and technical articles to understand functionalities and best practices. The &lt;strong&gt;HCL BigFix help documentation&lt;/strong&gt; is an excellent place to start.
It's also crucial to commit to ethical preparation. Avoid using "exam dumps" as they do not foster true understanding and can jeopardize the integrity of your certification. Focus on genuine learning and skill development, which provides lasting career benefits.
## Refining BigFix Platform 11 Administration and Endpoint Management
The "Administration &amp;amp; Management" domain, accounting for 25% of the HCL-BF-PRO-11 exam, is the cornerstone of effective BigFix utilization. This section demands a thorough understanding of how to efficiently manage a vast array of endpoints, ensuring their health, compliance, and security. Beyond theoretical knowledge, candidates must grasp the practical application of BigFix tools and processes in diverse operational scenarios.
Key areas to focus on include:&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Endpoint Configuration Management:&lt;/strong&gt; This involves creating and deploying custom configurations to endpoints, ensuring consistency and adherence to organizational policies. Understanding how to use baselines, custom  Fixlets, and tasks is paramount. Mastering these tools allows for dynamic and responsive management of endpoint settings, whether it's configuring network interfaces or enforcing specific registry settings.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Software Distribution and Deployment:&lt;/strong&gt; BigFix excels at deploying software packages across numerous endpoints, from operating system updates to specific application installations. You must understand the various methods for software deployment, including silent installations, managing dependencies, and monitoring deployment status. This also covers the process of packaging applications and creating relevant Fixlets for their distribution.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Content Management and Customization:&lt;/strong&gt; BigFix uses 'content' (Fixlets, tasks, analyses, baselines) to manage endpoints. The exam will test your ability to understand existing content, customize it to specific needs, and create entirely new content using Session Relevance Language (SRL) or similar scripting. This skill is critical for addressing unique organizational challenges that off-the-shelf content might not cover.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Role-Based Access Control (RBAC):&lt;/strong&gt; Implementing and managing RBAC within BigFix is essential for maintaining a secure and efficient environment. This involves defining roles, assigning permissions, and managing users and operators to ensure that individuals only have access to the BigFix capabilities and endpoints necessary for their job functions. Understanding the hierarchy of roles and how permissions are inherited or explicitly granted is vital.
Proficiency in these areas signifies a BigFix professional who can not only perform routine tasks but also adapt the platform to evolving business requirements. This segment of the exam truly measures a candidate's readiness for real-world BigFix administration challenges.
## Enhancing Security and Compliance with BigFix Capabilities
HCL BigFix Platform 11 plays a pivotal role in maintaining robust security postures and ensuring regulatory compliance across an organization's endpoints. This aspect is heavily weighted within the exam syllabus, particularly intersecting with the "Administration &amp;amp; Management" and "Operations &amp;amp; Usage" domains. Professionals aiming for the HCL-BF-PRO-11 certification must demonstrate a clear understanding of how BigFix mitigates risks and enforces compliance standards.
Consider these critical areas:&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Vulnerability Management:&lt;/strong&gt; BigFix provides comprehensive visibility into endpoint vulnerabilities by continuously assessing systems against known security flaws. The exam expects you to understand how to leverage BigFix to identify, prioritize, and remediate vulnerabilities, often through automated patch deployment or configuration changes. This includes integrating with vulnerability databases and understanding common attack vectors.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Patch Management Certification:&lt;/strong&gt; A core strength of BigFix is its efficient and reliable patch management capabilities. This involves not only deploying security patches for operating systems and applications but also managing patch cycles, addressing patch failures, and verifying successful deployments. The certification will test your knowledge of creating patching policies, scheduling deployments, and reporting on patch compliance. This ensures endpoints are protected against the latest threats.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Security Configuration Enforcement:&lt;/strong&gt; Beyond patching, BigFix allows for the enforcement of security configurations to meet organizational policies or industry benchmarks (e.g., CIS benchmarks). This could involve disabling unnecessary services, hardening browser settings, or managing firewall rules. Candidates should be adept at defining these configurations as baselines and automatically applying them to non-compliant endpoints.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Compliance Reporting and Auditing:&lt;/strong&gt; A significant part of compliance involves providing clear evidence of adherence to regulations (e.g., GDPR, HIPAA). BigFix generates detailed reports on endpoint status, patch levels, software installations, and security configurations. You need to know how to create customized reports, schedule their generation, and interpret the data to demonstrate compliance to auditors.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Remediation Strategies:&lt;/strong&gt; Understanding the process of not just identifying but actively remediating security and compliance issues is fundamental. This includes applying corrective actions automatically or through operator intervention, and then verifying that the remediation was successful. This proactive stance is what makes BigFix a powerful security tool.
Mastering these aspects of BigFix security and compliance demonstrates not just technical skill, but also a strategic mindset for protecting an organization's digital assets.
## Optimizing BigFix Platform 11 Performance and Troubleshooting Methods
The "Performance Tuning &amp;amp; Troubleshooting" domain (15% of the HCL-BF-PRO-11 exam) is essential for any BigFix administrator. It’s not enough to deploy the platform; you must ensure it runs efficiently and reliably, and be able to swiftly address issues when they arise. This section tests your analytical skills and your ability to diagnose and resolve complex problems within the BigFix environment.
Successful candidates will focus on:&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance Monitoring and Metrics:&lt;/strong&gt; Understanding the key performance indicators (KPIs) of a BigFix deployment is critical. This includes monitoring server health, database performance, relay efficiency, and client activity. Tools like BigFix's own dashboards, system monitoring utilities, and database performance analyzers are vital. Identifying abnormal trends or resource bottlenecks early can prevent widespread issues.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Database Optimization:&lt;/strong&gt; The BigFix server relies heavily on its database (SQL Server or DB2). Proficiency in optimizing database settings, maintaining indexes, and managing database size is crucial for sustained performance. This often involves understanding database best practices, backup and recovery procedures, and how BigFix data impacts database load.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Client and Relay Performance:&lt;/strong&gt; Efficient communication between clients, relays, and the server is fundamental. Troubleshooting this involves diagnosing network issues, verifying relay assignments, and ensuring clients are reporting correctly. Understanding client log files and debug settings can pinpoint communication failures or client-side processing delays.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Common Troubleshooting Scenarios:&lt;/strong&gt; The exam will likely present scenarios that require you to diagnose common BigFix problems. These could range from clients not reporting, content not deploying, or performance degradation. Developing a systematic approach to troubleshooting, starting with symptom analysis and moving to log review and component verification, is a key skill.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Using Diagnostic Tools:&lt;/strong&gt; BigFix provides several built-in and external tools for diagnostics, such as the &lt;code&gt;BESGather.log&lt;/code&gt; for server communication, client logs, and various command-line utilities. Knowing which tool to use in a given situation and how to interpret their output is indispensable for quick problem resolution. Additionally, community and developer resources like &lt;strong&gt;BigFix developer tools&lt;/strong&gt; can offer further insights into advanced diagnostics and custom scripting for problem-solving.
Mastery of these troubleshooting and performance tuning techniques ensures the BigFix platform remains a robust and responsive solution for endpoint management, minimizing downtime and maximizing operational efficiency.
## Cultivating Hands-On Experience for HCL-BF-PRO-11 Readiness
While theoretical knowledge is foundational, true mastery for the HCL-BF-PRO-11 certification comes from practical, hands-on experience. The BigFix Platform is designed for active management, and the exam scenarios often reflect real-world challenges that require not just knowing &lt;em&gt;what&lt;/em&gt; to do, but &lt;em&gt;how&lt;/em&gt; to do it. Building and experimenting in your own BigFix lab environment is indispensable for transforming concepts into concrete skills.
Embrace practical learning through:&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Setting Up a Test Environment:&lt;/strong&gt; Install a BigFix server, at least one relay, and several clients (covering different operating systems if possible) in a virtualized environment. This allows you to safely experiment with configurations, deployments, and troubleshooting without impacting production systems. Treat this lab as a sandbox for all your learning.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Executing Core Operations:&lt;/strong&gt; Practice the fundamental BigFix operations directly. This includes:&lt;/li&gt;
&lt;li&gt;  Deploying operating system patches and third-party application updates.&lt;/li&gt;
&lt;li&gt;  Creating and applying custom Fixlets and tasks for specific system configurations.&lt;/li&gt;
&lt;li&gt;  Managing software distribution from initial packaging to final deployment.&lt;/li&gt;
&lt;li&gt;  Configuring and testing compliance policies against various endpoints.&lt;/li&gt;
&lt;li&gt;  Implementing role-based access controls for different operator types.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Simulating Troubleshooting Scenarios:&lt;/strong&gt; Intentionally introduce common problems into your lab environment, such as breaking client communication, creating configuration conflicts, or simulating network latency. Then, practice using BigFix's diagnostic tools and logs to identify and resolve these issues. This builds critical problem-solving muscle.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Exploring Advanced Features:&lt;/strong&gt; Once comfortable with the basics, delve into more advanced BigFix capabilities. Experiment with custom content creation, integrate BigFix with other systems (if feasible in your lab), and explore reporting features in depth.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Engaging with the BigFix Community:&lt;/strong&gt; Leverage forums, user groups, and resources like the &lt;strong&gt;BigFix technical advice videos&lt;/strong&gt;
to learn from experienced professionals. Sharing your experiences and asking questions can provide insights into common challenges and creative solutions that you might not encounter in isolation.
This active engagement with the BigFix Platform will not only solidify your understanding of the syllabus but also prepare you for the scenario-based questions that are a hallmark of professional certification exams. Practical application is where theoretical knowledge truly takes root.
## Mastering Exam Day Logistics and Strategies
Approaching the HCL-BF-PRO-11 exam day with a clear mind and a strategic plan is just as important as your preparation. Stress management and effective test-taking techniques can significantly influence your performance. Understanding the format and leveraging the allotted time wisely will help you demonstrate your knowledge accurately under pressure.
To maximize your performance on exam day:&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pre-Exam Review:&lt;/strong&gt; In the days leading up to the exam, avoid cramming. Instead, focus on a high-level review of key concepts, formulas, and any areas you've marked as challenging. Ensure you get adequate rest and stay hydrated.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Time Management:&lt;/strong&gt; With 60 questions in 75 minutes, you have roughly 1 minute and 15 seconds per question. This requires a quick read, swift analysis, and confident selection. If a question is particularly difficult, flag it and move on, returning to it if time permits. Do not dwell too long on any single question.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Understanding Question Types:&lt;/strong&gt; Be prepared for a mix of question formats, including multiple-choice, multiple-response, and potentially scenario-based questions. Read each question carefully, paying close attention to keywords such as "NOT," "ALWAYS," or "BEST."&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Process of Elimination:&lt;/strong&gt; For multiple-choice questions, eliminate obviously incorrect answers first. This increases your chances of selecting the correct answer, even if you're not entirely certain.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Review and Verify:&lt;/strong&gt; If you finish early, use the remaining time to review flagged questions and double-check your answers. Ensure you haven't misread any questions or made simple errors. Trust your initial instinct unless you find compelling evidence to change an answer.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Technical Setup (for online exams):&lt;/strong&gt; If taking the exam remotely, ensure your internet connection is stable, your environment is quiet and free from distractions, and your system meets all proctoring software requirements. Test your setup well in advance to avoid last-minute technical glitches.
Confidence on exam day stems from thorough preparation and a clear strategy. By managing your time effectively and approaching each question methodically, you can significantly enhance your chances of passing the HCL-BF-PRO-11.
## Elevating Your Career with HCL BigFix Platform 11 Certification
Earning the HCL-BF-PRO-11 certification is more than just passing an exam; it’s a strategic investment in your professional future. This credential signifies a recognized level of expertise in a critical area of IT infrastructure management and security, opening doors to advanced opportunities and enhancing your value in the job market. As organizations increasingly rely on robust endpoint management solutions, certified BigFix professionals are in high demand.
The benefits of holding this certification extend beyond immediate job requirements:&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Enhanced Career Mobility:&lt;/strong&gt; The HCL-BF-PRO-11 certification positions you as a specialist in endpoint security and compliance. This can lead to promotions within your current role or open up new opportunities as a BigFix Administrator, Security Operations Analyst, IT Systems Engineer, or even a BigFix Consultant. It demonstrates a commitment to professional development in a vital domain.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Increased Earning Potential:&lt;/strong&gt; Professionals with specialized certifications often command higher salaries. The expertise validated by HCL-BF-PRO-11 makes you a valuable asset to any organization struggling with complex endpoint environments, translating into a competitive edge in salary negotiations.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Industry Recognition:&lt;/strong&gt; HCLSoftware is a respected name in enterprise software. Being a Certified Professional from HCLSoftware carries significant weight, signaling to peers and employers that you possess verified skills and a deep understanding of their technology. This recognition can boost your professional credibility and network.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Validation of Expertise:&lt;/strong&gt; The certification objectively validates your ability to tackle real-world BigFix challenges, from initial planning and deployment to advanced administration and troubleshooting. This gives both you and your employer confidence in your capabilities, reducing the learning curve for new projects and ensuring efficient system operations.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Staying Ahead in Technology:&lt;/strong&gt; The IT landscape is constantly evolving, particularly in areas of cybersecurity and endpoint management. Earning certifications like HCL-BF-PRO-11 ensures your skills remain current and relevant, adapting to the latest platform features and industry best practices. This continuous learning mindset is invaluable in a fast-paced tech environment.
Ultimately, the HCL BigFix Platform 11 professional certification is a testament to your dedication and skill, empowering you to contribute more effectively to your organization's success and carve out a distinguished path in your IT career.
## Conclusion
The HCL-BF-PRO-11 certification is a significant milestone for any IT professional focused on robust endpoint management, security, and compliance. This credential not only validates your technical prowess in HCL BigFix Platform 11 but also significantly enhances your professional standing and career trajectory. By meticulously planning your study, diving deep into each syllabus domain, gaining extensive hands-on experience, and employing effective exam strategies, you can confidently approach and pass this challenging examination.
Your dedication to mastering HCL BigFix Platform 11 will equip you with indispensable skills, making you a vital asset in safeguarding enterprise environments. Embrace the journey of learning, apply the concepts diligently, and leverage all available resources to ensure your success.
To further solidify your understanding and ensure you're fully prepared, explore comprehensive study materials and practice tests designed to simulate the actual exam experience. For more insights into HCL BigFix and other related topics, consider reading our detailed articles on mastering various aspects of the platform. Visit the HCL BigFix official help documentation and other &lt;strong&gt;BigFix technical resources&lt;/strong&gt; to deepen your knowledge and hone your skills for exam day and beyond.
## Frequently Asked Questions
&lt;strong&gt;1. What specific job roles benefit most from the HCL-BF-PRO-11 certification?&lt;/strong&gt;
The HCL-BF-PRO-11 certification is highly beneficial for IT professionals in roles such as BigFix Administrator, Endpoint Security Engineer, IT Operations Specialist, System Administrator, and Security Analyst, as it validates core competencies in managing BigFix Platform 11 for comprehensive endpoint control.
&lt;strong&gt;2. How does hands-on experience contribute to passing the HCL-BF-PRO-11 exam?&lt;/strong&gt;
Hands-on experience is critical because the HCL-BF-PRO-11 exam includes scenario-based questions that assess practical application of BigFix. Setting up a lab environment and performing tasks like installation, configuration, patch management, and troubleshooting helps solidify theoretical knowledge and prepares you for real-world challenges.
&lt;strong&gt;3. Are there any prerequisites for taking the HCL-BF-PRO-11 certification exam?&lt;/strong&gt;
While HCLSoftware does not explicitly list formal prerequisites for the HCL-BF-PRO-11 exam, it is strongly recommended that candidates have significant practical experience with BigFix Platform 11 and have completed relevant HCLSoftware U training courses to ensure adequate preparation.
&lt;strong&gt;4. What is the validity period of the HCL-BF-PRO-11 certification?&lt;/strong&gt;
The validity period for HCLSoftware certifications, including HCL-BF-PRO-11, typically depends on the vendor's policy, which may require periodic re-certification or passing an updated version of the exam to maintain active status. Candidates should refer to the official HCLSoftware U certification page for the most current information regarding re-certification policies.
&lt;strong&gt;5. What kind of preparation materials does HCLSoftware recommend for HCL-BF-PRO-11?&lt;/strong&gt;
HCLSoftware primarily recommends its official training courses through HCLSoftware U, along with extensive use of the official BigFix documentation, product manuals, and the HCL BigFix Wiki. These resources provide the most accurate and up-to-date information relevant to the exam syllabus and best practices.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
