Splunk Загрузить csv из GCP в поиск KVStore с помощью Python SDK

В настоящее время у нас есть файл CSV размером 45 МБ, который мы собираемся загрузить в Splunk kvstore. Я хочу сделать это с помощью SDK Python, но у меня возникают проблемы с загрузкой записей.

Единственный способ, которым я могу обновить kvstore, — это функция service.collection.insert(), которая, насколько я могу судить, принимает только одну строку за раз. Учитывая, что в этом файле 250 тыс. строк, я не могу позволить себе каждый день ждать загрузки всех строк.

Это то, что у меня есть до сих пор:

 from splunklib import client, binding
 import json, pandas as pd
 from copy import deepcopy

 data_file = '/path/to/file.csv'

 username = 'user'
 password = 'splunk_pass'
 connectionHandler = binding.handler(timeout=12400)
 connect_kwargs = {
     'host': 'splunk-host.com',
     'port': 8089,
     'username': username,
     'password': password,
     'scheme': 'https',
     'autologin': True,
     'handler': connectionHandler
 }
 flag = True
 while flag:
     try:
         service = client.connect(**connect_kwargs)
         service.namespace['owner'] = 'Nobody'
         flag = False
     except binding.HTTPError:
         print('Splunk 504 Error')

 kv = service.kvstore
 kv['test_data'].delete()
 df = pd.read_csv(data_file)
 df.replace(pd.np.nan, '', regex=True)
 df['_key'] = df['key_field']
 result = df.to_dict(orient='records')
 fields = deepcopy(result[0])
 for field in fields.keys():
     fields[field] = type(fields[field]).__name__
 df = df.astype(fields)
 kv.create(name='test_data', fields=fields, owner='nobody', sharing='system')
 for row in result:
     row = json.dumps(row)
     row.replace("nan", "'nan'")
     kv['learning_center'].data.insert(row)
 transforms = service.confs['transforms']
 transforms.create(name='learning_center_lookup', **{'external_type': 'kvstore', 'collection': 'learning_center', 'fields_list': '_key, userGuid', 'owner': 'nobody'})
 # transforms['learning_center_lookup'].delete()
 collection = service.kvstore['learning-center']
 print(collection.data.query())

В дополнение к проблеме, связанной с вечной загрузкой четверти миллиона записей, он продолжает давать сбой в строке со значением nan, и независимо от того, что я туда добавляю, чтобы попытаться справиться с nan, он сохраняется в значении словаря.


person Cdhippen    schedule 24.01.2020    source источник


Ответы (1)


Вы можете напрямую взаимодействовать с конечной точкой REST, а затем использовать storage/collections/data/{collection}/batch_save для сохранения нескольких элементов по мере необходимости.

См. https://docs.splunk.com/Documentation/Splunk/8.0.1/RESTREF/RESTkvstore#storage.2Fcollections.2Fdata.2F.7Bcollection.7D.2Fbatch_save

person Simon Duff    schedule 26.01.2020