<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: breaking multiple mv fields into single events based on array index in Splunk Search</title>
    <link>https://community.splunk.com/t5/Splunk-Search/breaking-multiple-mv-fields-into-single-events-based-on-array/m-p/710216#M239958</link>
    <description>&lt;P&gt;First, when illustrating structured data, please post compliant raw text. &amp;nbsp;In your case, a compliant JSON should be&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;{
   "application": "app1",
   "feature": "feature1",
   "timestamp": "01/29/2025 23:02:00 +0000",
   "users": [ 
     { 
       "userhost": "client1",
       "username": "user1"
     },
     { 
       "userhost": "client2",
       "username": "user2"
     }
   ]
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The trick here is to reach into the JSON array to perform mvexpand and ignore Splunk's default flattening of array.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| spath path=users{}
| mvexpand users{}
| spath input=users{}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Your sample data will give&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;application&lt;/TD&gt;&lt;TD&gt;feature&lt;/TD&gt;&lt;TD&gt;timestamp&lt;/TD&gt;&lt;TD&gt;userhost&lt;/TD&gt;&lt;TD&gt;username&lt;/TD&gt;&lt;TD&gt;users{}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;app1&lt;/TD&gt;&lt;TD&gt;feature1&lt;/TD&gt;&lt;TD&gt;01/29/2025 23:02:00 +0000&lt;/TD&gt;&lt;TD&gt;client1&lt;/TD&gt;&lt;TD&gt;user1&lt;/TD&gt;&lt;TD&gt;{ "userhost": "client1", "username": "user1" }&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;app1&lt;/TD&gt;&lt;TD&gt;feature1&lt;/TD&gt;&lt;TD&gt;01/29/2025 23:02:00 +0000&lt;/TD&gt;&lt;TD&gt;client2&lt;/TD&gt;&lt;TD&gt;user2&lt;/TD&gt;&lt;TD&gt;{ "userhost": "client2", "username": "user2" }&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;Here is an emulation for you to play with and compare with real data&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| makeresults
| eval _raw = "{
   \"application\": \"app1\",
   \"feature\": \"feature1\",
   \"timestamp\": \"01/29/2025 23:02:00 +0000\",
   \"users\": [ 
     { 
       \"userhost\": \"client1\",
       \"username\": \"user1\"
     },
     { 
       \"userhost\": \"client2\",
       \"username\": \"user2\"
     }
   ]
}"
| spath
``` data emulation above ```&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 30 Jan 2025 03:38:48 GMT</pubDate>
    <dc:creator>yuanliu</dc:creator>
    <dc:date>2025-01-30T03:38:48Z</dc:date>
    <item>
      <title>breaking multiple mv fields into single events based on array index</title>
      <link>https://community.splunk.com/t5/Splunk-Search/breaking-multiple-mv-fields-into-single-events-based-on-array/m-p/710207#M239952</link>
      <description>&lt;P&gt;I have data that looks something like this, coming in as JSON:&lt;BR /&gt;&lt;BR /&gt;time, application, feature, username, hostname&lt;/P&gt;&lt;P&gt;The problem is that username and hostname are nested arrays, like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;{
   application: app1
   feature: feature1
   timestamp: 01/29/2025 23:02:00 +0000
   users: [ 
     { 
       userhost: client1
       username: user1
     }
     { 
       userhost: client2
       username: user2
     }
   ]
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;and when the event shows up in splunk, userhost and username are converted to multi-value fields.&lt;/P&gt;&lt;TABLE border="1" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="20%"&gt;_time&lt;/TD&gt;&lt;TD width="20%"&gt;application&lt;/TD&gt;&lt;TD width="20%"&gt;feature&lt;/TD&gt;&lt;TD width="20%"&gt;users{}.username&lt;/TD&gt;&lt;TD width="20%"&gt;users{}.userhost&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="20%"&gt;01/29/2025 23:02:00&lt;/TD&gt;&lt;TD width="20%"&gt;app1&lt;/TD&gt;&lt;TD width="20%"&gt;feature1&lt;/TD&gt;&lt;TD width="20%"&gt;user1&lt;BR /&gt;user2&lt;/TD&gt;&lt;TD width="20%"&gt;client1&lt;BR /&gt;client2&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I need an SPL method to convert these into individual events for the purposes of a search, so that I can perform ldap lookups on each hostname. mvexpand only works on one field at a time and doesn't recognize users or users{} as valid input, which loses the relationship between user1:client1 and user2:client2. How can I convert both arrays to individual events by array index, so that I preserve the relationship between username and hostname, like this:&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="20%"&gt;_time&lt;/TD&gt;&lt;TD width="20%"&gt;application&lt;/TD&gt;&lt;TD width="20%"&gt;feature&lt;/TD&gt;&lt;TD width="20%"&gt;users{}.username&lt;/TD&gt;&lt;TD width="20%"&gt;users{}.userhost&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="20%"&gt;01/29/2025 23:02:00&lt;/TD&gt;&lt;TD width="20%"&gt;app1&lt;/TD&gt;&lt;TD width="20%"&gt;feature1&lt;/TD&gt;&lt;TD width="20%"&gt;user1&lt;/TD&gt;&lt;TD width="20%"&gt;client1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;01/29/2025 23:02:00&lt;/TD&gt;&lt;TD&gt;app1&lt;/TD&gt;&lt;TD&gt;feature1&lt;/TD&gt;&lt;TD&gt;user2&lt;/TD&gt;&lt;TD&gt;client2&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Wed, 29 Jan 2025 23:16:43 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/breaking-multiple-mv-fields-into-single-events-based-on-array/m-p/710207#M239952</guid>
      <dc:creator>pmdba</dc:creator>
      <dc:date>2025-01-29T23:16:43Z</dc:date>
    </item>
    <item>
      <title>Re: breaking multiple mv fields into single events based on array index</title>
      <link>https://community.splunk.com/t5/Splunk-Search/breaking-multiple-mv-fields-into-single-events-based-on-array/m-p/710213#M239955</link>
      <description>&lt;P&gt;If you want to do this at search time, create a composite field and expand that, e.g.&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| eval composite_field=mvzip('users{}.userhost', 'users{}.username', "###")
| fields - users{}*
| mvexpand composite_field
| rex field=composite_field "(?&amp;lt;userhost&amp;gt;.*)###(?&amp;lt;username&amp;gt;.*)"
| fields - composite_field&lt;/LI-CODE&gt;&lt;P&gt;it will only zip correctly if there are exactly equal elements in each of the MV fields.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Jan 2025 02:58:48 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/breaking-multiple-mv-fields-into-single-events-based-on-array/m-p/710213#M239955</guid>
      <dc:creator>bowesmana</dc:creator>
      <dc:date>2025-01-30T02:58:48Z</dc:date>
    </item>
    <item>
      <title>Re: breaking multiple mv fields into single events based on array index</title>
      <link>https://community.splunk.com/t5/Splunk-Search/breaking-multiple-mv-fields-into-single-events-based-on-array/m-p/710216#M239958</link>
      <description>&lt;P&gt;First, when illustrating structured data, please post compliant raw text. &amp;nbsp;In your case, a compliant JSON should be&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;{
   "application": "app1",
   "feature": "feature1",
   "timestamp": "01/29/2025 23:02:00 +0000",
   "users": [ 
     { 
       "userhost": "client1",
       "username": "user1"
     },
     { 
       "userhost": "client2",
       "username": "user2"
     }
   ]
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The trick here is to reach into the JSON array to perform mvexpand and ignore Splunk's default flattening of array.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| spath path=users{}
| mvexpand users{}
| spath input=users{}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Your sample data will give&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;application&lt;/TD&gt;&lt;TD&gt;feature&lt;/TD&gt;&lt;TD&gt;timestamp&lt;/TD&gt;&lt;TD&gt;userhost&lt;/TD&gt;&lt;TD&gt;username&lt;/TD&gt;&lt;TD&gt;users{}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;app1&lt;/TD&gt;&lt;TD&gt;feature1&lt;/TD&gt;&lt;TD&gt;01/29/2025 23:02:00 +0000&lt;/TD&gt;&lt;TD&gt;client1&lt;/TD&gt;&lt;TD&gt;user1&lt;/TD&gt;&lt;TD&gt;{ "userhost": "client1", "username": "user1" }&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;app1&lt;/TD&gt;&lt;TD&gt;feature1&lt;/TD&gt;&lt;TD&gt;01/29/2025 23:02:00 +0000&lt;/TD&gt;&lt;TD&gt;client2&lt;/TD&gt;&lt;TD&gt;user2&lt;/TD&gt;&lt;TD&gt;{ "userhost": "client2", "username": "user2" }&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;Here is an emulation for you to play with and compare with real data&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| makeresults
| eval _raw = "{
   \"application\": \"app1\",
   \"feature\": \"feature1\",
   \"timestamp\": \"01/29/2025 23:02:00 +0000\",
   \"users\": [ 
     { 
       \"userhost\": \"client1\",
       \"username\": \"user1\"
     },
     { 
       \"userhost\": \"client2\",
       \"username\": \"user2\"
     }
   ]
}"
| spath
``` data emulation above ```&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Jan 2025 03:38:48 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/breaking-multiple-mv-fields-into-single-events-based-on-array/m-p/710216#M239958</guid>
      <dc:creator>yuanliu</dc:creator>
      <dc:date>2025-01-30T03:38:48Z</dc:date>
    </item>
  </channel>
</rss>

