サーバーログの処理には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)
私の編集を見て、私は引数を取ることができないのですか? – flybonzai