2016-04-15 4 views
1

サーバーログの処理にはpysparkを使用しています。機能プログラミングの概念は全く新しくなっています。私はそうのようないくつかのオプションから選択することが私の機能で使用しているルックアップテーブルを持っている:グローバルを使用するか、関数をマップする引数を渡す方が良いですか?

user_agent_vals = { 
     'CanvasAPI': 'api', 
     'candroid': 'mobile_app_android', 
     'iCanvas': 'mobile_app_ios', 
     'CanvasKit': 'mobile_app_ios', 
     'Windows NT': 'desktop', 
     'MacBook': 'desktop', 
     'iPhone': 'mobile', 
     'iPod Touch': 'mobile', 
     'iPad': 'mobile', 
     'iOS': 'mobile', 
     'CrOS': 'desktop', 
     'Android': 'mobile', 
     'Linux': 'desktop', 
     'Mac OS': 'desktop', 
     'Macintosh': 'desktop' 
    } 

def parse_requests(line): 
    """ 
    Expects an input list, which is then mapped to the correct fieldnames in 
    a dict. 

    :param line: A list of values. 
    :return: A list containing the values for writing to a file. 
    """ 
    values = dict(zip(requests_fieldnames, line)) 
    print(values) 
    values['request_timestamp'] = values['request_timestamp'].split('-')[1] 
    found = False 
    for key, value in user_agent_vals.items(): 
     if key in values['user_agent']: 
      found = True 
      values['user_agent'] = value 
    if not found: 
     values['user_agent'] = 'other_unknown' 
    return [ 
     values['user_id'], 
     values['context_id'], 
     values['request_timestamp'], 
     values['user_agent'] 
    ] 

私は(する関数を呼び出す辞書を再定義するたびにしたくありません数百万回)、モジュールネームスペースで辞書を見つけるためにPythonのLEGBルックアップを使うだけで何とか「汚い」ように思えます。 parse_requestsを呼び出すマップ関数に引数を渡す必要があります(もしそうなら、どうすればよいでしょうか?)、またはこれを処理するベストプラクティスの方法は何でしょうか?

参考のために、ここで私のマップ呼び出しは次のとおりです。

parsed_data = course_data.map(parse_requests) 

答えて

1

このようなグローバルな「定数」のためにすべて大文字を使用する慣例である:例えば

USER_AGENT_VALS 

を、デフォルトの設定は、 pylintは、モジュールレベルの変数(関数およびクラス以外)のすべての大文字名のみを許可します。あなたはfunctools.partial()を持つ関数の引数を "凍結" することができます

parse_requests(line, user_agent_vals) 

:と

def parse_requests(line, user_agent_vals): 

コール:

from functools import partial 

parse_requests_for_map = partial(parse_requests, user_agent_vals=user_agent_vals) 

代わりに、あなたは第二引数としてuser_agent_valsを供給することができます

今、と一緒に使用できます10:

parsed_data = course_data.map(parse_requests_for_map) 
+0

私の編集を見て、私は引数を取ることができないのですか? – flybonzai

1

オブジェクトに必要なすべてのものを入れて、(いくつかのdef __call__(self, arg):メソッドを定義することによって)「呼び出し可能」オブジェクトを作成し、使用するマップの関数としてオブジェクトを渡します。

ニースの例here(マルチプロセッシングのマップについてはこの手法が一般的に適用可能です)。

関連する問題