#python #sql-server #tsql #ssms
#python #sql-сервер #tsql #ssms
Вопрос:
Мы используем MS SQL Server для нашего решения с внешним скриптом python для запроса статистической базы данных каждое утро, которая возвращает JSON-Stat. Затем мы запускаем этот JSON-Stat через библиотечную функцию Pyjstat from_json_stat(), чтобы преобразовать его из JSON-Stat в фрейм данных pandas, который может прочитать MS SQL Server.
Для самых больших таблиц из этой национальной статистической базы данных это может занять до 7-10 минут, у нас была идея использовать многопроцессорную обработку python, чтобы, по крайней мере, ускорить from_json_stat. Запуск кода на python работает безупречно, однако, когда мы затем запускаем код через Microsoft SQL Management Studio, мы получаем ошибку pickle для той самой функции, которую мы пытались ускорить.
Это соответствующий код, он работает на python, и мы получаем значительное ускорение при выполнении самых больших запросов, но не через внешний скрипт SSMS на python.
def run_pyjstat(result_list):
return pyjstat.from_json_stat(result_list.json(object_pairs_hook=OrderedDict), naming="id")[0]
def post_query():
meta_data = meta_filter()
result_list = []
for variables in meta_data:
query = build_query(variables)
data = requests.post(ssb_table.metadata_url, json=query)
result_list.append(data)
time.sleep(5.0)
return result_list
def master():
dataframes = []
x = post_query()
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
dataframes = pool.map(run_pyjstat, x)
pool.close()
pool.join()
big_df = pd.concat(dataframes, ignore_index=True)
return big_df
if __name__ == "__main__":
ssb_table = SSBTable(TableNumber)
klass = RegionKLASS(["131", "104", "214", "231"])
r = master()
Это ошибка, которую мы получаем, и та, которую мы получали
Error in execution. Check the output for more information.
Traceback (most recent call last):
File "<string>", line 5, in <module>
File "D:SQL-MSSQLSERVER-ExtensibilityData-PYMSSQLSERVER01ECB2A7F-0698-4FA7-86E6-76EF41292E20sqlindb.py", line 691, in transform
r = master()
File "D:SQL-MSSQLSERVER-ExtensibilityData-PYMSSQLSERVER01ECB2A7F-0698-4FA7-86E6-76EF41292E20sqlindb.py", line 667, in master
dataframes = pool.map(run_pyjstat, x)
File "C:Program FilesMicrosoft SQL ServerMSSQL14.MSSQLSERVERPYTHON_SERVICESlibmultiprocessingpool.py", line 260, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "C:Program FilesMicrosoft SQL ServerMSSQL14.MSSQLSERVERPYTHON_SERVICESlibmultiprocessingpool.py", line 608, in get
raise self._value
File "C:Program FilesMicrosoft SQL ServerMSSQL14.MSSQLSERVERPYTHON_SERVICESlibmultiprocessingpool.py", line 385, in _handle_tasks
Msg 39019, Level 16, State 2, Line 2
An external script error occurred:
put(task)
File "C:Program FilesMicrosoft SQL ServerMSSQL14.MSSQLSERVERPYTHON_SERVICESlibmultiprocessingconnection.py", line 206, in send
self._send_bytes(ForkingPickler.dumps(obj))
File "C:Program FilesMicrosoft SQL ServerMSSQL14.MSSQLSERVERPYTHON_SERVICESlibmultiprocessingreduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
AttributeError: Can't pickle local object 'transform.<locals>.run_pyjstat'
SqlSatelliteCall error: Error in execution. Check the output for more information.
Мы оба, нанятые для этого проекта, являемся младшими школьниками и в основном использовали Java в школе. Других разработчиков, к которым мы могли бы обратиться непосредственно, нет, а поиск в Google не дает много результатов по этому конкретному вопросу. Возможно, мои навыки поиска в Google просто плохие.
Мы рассматривали возможность отказа от MS SQL Server external_script и использования Java, но на данный момент он работает без многопроцессорной обработки, хотя и медленнее, чем мы хотим.
Есть ли какой-либо способ заставить это работать с внешним скриптом python?