class_docstr: Abstract Parser class to be inherited by all StreamAlert Parsers
class_docstr_tok: ["Abstract","Parser","class","to","be","inherited","by","all","StreamAlert","Parsers"]
docstr: Add optional keys to a raw record
  
  Args:
      data (dict): Parsed record value
      schema (dict): Schema for the data being parsed
      optional_keys (set): The optional keys in the schema
docstr_tok: ["Add","optional","keys","to","a","raw","record","Args",":","data","(","dict",")",":","Parsed","record","value","schema","(","dict",")",":","Schema","for","the","data","being","parsed","optional_keys","(","set",")",":","The","optional","keys","in","the","schema"]
code: def _add_optional_keys(cls, data, schema, optional_keys):
      """Add optional keys to a raw record
  
      Args:
          data (dict): Parsed record value
          schema (dict): Schema for the data being parsed
          optional_keys (set): The optional keys in the schema
      """
      if not (schema and optional_keys):
          return  # Nothing to do
  
      for key_name in optional_keys:
          # Add the optional key if it does not exist in the parsed json payload
          data[key_name] = data.get(
              key_name, cls.default_optional_values(schema[key_name])
          )
  
imports: from abc import ABCMeta, abstractmethod
  from copy import deepcopy
  import csv
  from fnmatch import fnmatch
  import json
  import logging
  import re
  import io
  import jmespath
  from streamalert.shared.logger import get_logger
label_desc: Use image node_id 18 for calling the ParserBase obj's underlying member method code with example usage: obj._add_optional_keys(cls, data, schema, optional_keys) without return types