modules/python/kusto/generate_commands.py (53 lines of code) (raw):
import json
import sys
import base64
from dateutil.parser import isoparse
def infer_type(value):
# Check if it's a boolean
if isinstance(value, str) and value.lower() in ['true', 'false']:
return "bool"
# Check if it's an integer
try:
int(value)
return "real"
except (ValueError, TypeError):
pass
# Check if it's a float
try:
float(value)
return "real"
except (ValueError, TypeError):
pass
# Check if it's dynamic
if isinstance(value, (dict, list)):
return "dynamic"
# Attempt to load the string as JSON
try:
parsed_json = json.loads(str(value))
if isinstance(parsed_json, (dict, list)):
return "dynamic"
except (json.JSONDecodeError, TypeError):
pass
# Check if it's a datetime
try:
isoparse(value)
return "datetime"
except ValueError:
pass
# If none of the above, take it as string
return "string"
def generate_kusto_commands(data, table_name):
# Create table command
table_command = f".create table ['{table_name}'] ("
for key, value in data.items():
infered_type = infer_type(value)
table_command += f"['{key}']:{infered_type}, "
table_command = table_command.rstrip(", ") + ")"
# Create table ingestion json mapping command
mapping_command = f".create table ['{table_name}'] ingestion json mapping '{table_name}_mapping' '["
for key in data.keys():
mapping_command += f"{{\"column\":\"{key}\", \"Properties\":{{\"Path\":\"$[\\'{key}\\']\"}}}},"
mapping_command = mapping_command.rstrip(", ") + "]'"
kusto_commands = f"{table_command}\n\n{mapping_command}"
return kusto_commands
def main():
table_name = sys.argv[1]
schema_path = sys.argv[2]
with open(schema_path, 'r', encoding='utf-8') as schema_file:
json_data = schema_file.readline()
json_object = json.loads(json_data)
kusto_commands = base64.b64encode(generate_kusto_commands(json_object, table_name).encode("utf-8"))
print(kusto_commands.decode("utf-8"))
if __name__ == "__main__":
main()