可以在MS SQL Server上使用python多处理吗

2024-10-02 02:42:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我们使用MS SQL Server作为解决方案,使用外部python脚本每天早上查询一个统计数据库,该数据库返回一个JSON-Stat。然后,我们通过来自_JSON_Stat()的Pyjstat库函数运行该JSON Stat,将其从JSON Stat转换为MS SQL Server可以读取的数据帧

在这个国家统计数据库中最大的表上,这可能需要7-10分钟,我们的想法是使用python的多处理至少从_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。在这个前提下,我们没有其他开发者可以询问,谷歌上的搜索在这个特定问题上不会产生很多结果。也许我的谷歌搜索技能很差

我们已经考虑过不再使用MS SQL Server外部_脚本,而是使用Java,但目前它可以在没有多处理的情况下工作,尽管速度比我们希望的要慢

有什么方法可以让python外部脚本起作用吗


Tags: inpysqlserverlineresultprogramquery

热门问题