是否可以在MS SQL Server中使用python多处理功能

问题描述

我们每天早上都在使用MS SQL Server和外部python脚本来查询统计数据库,该数据库返回JSON-Stat。然后,我们通过Pyjstat库函数from_json_stat()运行该JSON-Stat,将其从JSON-Stat转换为MS SQL Server可以读取的pandas DataFrame。

在这个国家统计数据库中最大的表格上,这可能需要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-PY\MSSQLSERVER01\0ECB2A7F-0698-4FA7-86E6-76EF41292E20\sqlindb.py",line 691,in transform
    r = master()
  File "D:\SQL-MSSQLSERVER-ExtensibilityData-PY\MSSQLSERVER01\0ECB2A7F-0698-4FA7-86E6-76EF41292E20\sqlindb.py",line 667,in master
    dataframes = pool.map(run_pyjstat,x)
  File "C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\multiprocessing\pool.py",line 260,in map
    return self._map_async(func,iterable,mapstar,chunksize).get()
  File "C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\multiprocessing\pool.py",line 608,in get
    raise self._value
  File "C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\multiprocessing\pool.py",line 385,in _handle_tasks

Msg 39019,Level 16,State 2,Line 2
An external script error occurred: 
    put(task)
  File "C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\multiprocessing\connection.py",line 206,in send
    self._send_bytes(ForkingPickler.dumps(obj))
  File "C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\multiprocessing\reduction.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外部脚本一起使用?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)