2017-10-30 6 views
0

現在、SparkのコードをMSSQL Analytical Services with Pythonに移植しています。すべてが素晴らしく、素敵ですが、私のソリューションがスクリプトの複数の入力に対して正しいのかどうかはわかりません。私はsuper_packageと呼ばれるカスタムパッケージとsample_modelというサンプルモデルを持っているMSSQL Serverの複数入力ソース2017 Python分析サービス

DROP PROCEDURE IF EXISTS SampleModel; 
GO 

CREATE PROCEDURE SampleModel 
AS 
BEGIN 
exec sp_execute_external_script 
@language =N'Python', 
@script=N' 
import sys 
sys.path.append("C:\path\to\custom\package") 

from super_package.sample_model import run_model 

OutputDataSet = run_model()' 
WITH RESULT SETS ((Score float)); 
END 
GO 

INSERT INTO [dbo].[SampleModelPredictions] (prediction) EXEC [dbo].[SampleModel] 
GO 

は、次のコードスニペットを考えてみましょう。このモデルは、入力として、複数のデータベーステーブルを使用し、以来、私はむしろ、一つの場所にあるすべてのものを持っているでしょう、私は、データベースに接続し、直接データをフェッチモジュールを持っている:run_model()関数の内部

def go_go_get_data(query, config): 
    return rx_data_step(RxSqlServerData(
     sql_query=query, 
     connection_string=config.connection_string, 
     user=config.user, 
     password=config.password)) 

私は必要なすべてのデータをフェッチgo_go_get_data機能を持つデータベースから取得します。

データが大きすぎて1回の処理で処理できない場合は、ページ設定を行います。 一般的に私はテーブルに加わることができないので、この解決法は機能しません。 質問は:これはこの問題に取り組むための正しいアプローチですか?それとも私は何かが恋しい?今のところこれはうまくいきますが、私がまだ開発/試行段階にある中で、私はこれが拡大するとは確信できません。私はむしろ、ストアドプロシージャのパラメータをPythonコンテキストの内部で取得するよりも使いたいと思います。

+0

こんにちは@muma! 「一般的にはテーブルに参加できないので、この解決策は動作しません」と言うときは、Python内のテーブルに参加できない、あるいは 'sp_execute_external_scriptの' @ input_data_1'パラメータを設定できないということですか? '結合を含むクエリには? –

+0

両方、Pythonスクリプト内でも '@ input_data_1'パラメータ内にもありません。 – muma

答えて

1

あなたは確かに限り、スクリプトが大丈夫であるように、データをフェッチするために、スクリプト内から照会することができますが、すでに:-(

sp_execucte_external_scriptのみに渡される1つの結果が設定可能に、考え出してきたようにそれは現在のSQLセッションのユーザーの権限の下で実行していないという事実。

ページ付けが重要であり、1つのデータセットが他よりも有意に大きいですし、Enterprise Editionのを使用している場合は、あなたがに設定され、最大データを渡す検討するかもしれませんsp_execute_external_scriptのストリーミング機能を使用してチャンク内のスクリプト

すべてのデータをSQL Serverに組み込む場合は、あなたのスクリプト内のクエリによってフェッチされた場合)、serialize the result sets and then pass them in as parameters(リンクはRでこれを行う方法を説明しますが、Pythonでは同様のことが可能でなければなりません)。

関連する問題