Используйте окно Pyspark, соберите предыдущие значения 5 col в виде списка и вызовите best_fit_udf
#moodified this function to handle 0 division and size of elements
def best_fit(X, Y):
xbar = sum(X)/len(X)
ybar = sum(Y)/len(Y)
n = len(X)
if n < 6 :
return None
numer = sum([xi*yi for xi,yi in zip(X, Y)]) - n * xbar * ybar
denum = sum([xi**2 for xi in X]) - n * xbar**2
if denum == 0:
return None
else:
return numer / denum
best_fit_udf = udf(best_fit, DoubleType())
cols = ['x_vals','y_vals']
df = pd.DataFrame(columns=cols)
for i in range(0,20):
df.loc[i,'x_vals'] = i
df.loc[i,'y_vals'] = 0.05 * i**2 + 0.1 * i + random.uniform(-1,1) #some random parabolic points
spark_df = spark.createDataFrame(df)
w = Window.orderBy("x_vals").rowsBetween(-5, 0)
df = spark_df.select("x_vals","y_vals",(F.collect_list('x_vals')).over(w).alias("x_list"), (F.collect_list('y_vals')).over(w).alias("y_list"))
df.withColumn("slope", best_fit_udf('x_list','y_list') ).drop('x_list','y_list').show()
, что даст мне
+------+--------------------+------------------+
|x_vals| y_vals| slope|
+------+--------------------+------------------+
| 0|-0.05626232194330516| null|
| 1| 1.0626613654187942| null|
| 2|-0.18870622421238525| null|
| 3| 1.7106172105001147| null|
| 4| 1.9398571272258158| null|
| 5| 2.3632022124308474| 0.475092382628695|
| 6| 1.7264493731921893|0.3201115790149247|
| 7| 3.298712278452215|0.5116552596172641|
| 8| 4.3179382280764305|0.4707547914949186|
| 9| 4.00691449276564|0.5077645079970263|
| 10| 6.085792506183289|0.7563877936316236|
| 11| 7.272669055040746|1.0223232959178614|
| 12| 8.70598472345308| 1.085126649123283|
| 13| 10.141576882812515|1.2686365861314373|
| 14| 11.170519757896672| 1.411962717827295|
| 15| 11.999868557507794|1.2199864149871311|
| 16| 14.86294824152797|1.3960568659909833|
| 17| 16.698964370210007| 1.570238888844051|
| 18| 18.71951724368806|1.7810890092953742|
| 19| 20.428078271618062|1.9509358501665701|
+------+--------------------+------------------+
PsExec является частью sysinternals комплекта, который может сделать это
http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
Если Ваши серверы запускают Windows 2008, можно также использовать
Вы можете использовать команду "at".
Откройте командную строку и введите
at /?
в терминал. Единственным недостатком является то, что время в удаленной системе должно быть в разумных пределах от вашего. Это тоже не мгновенно. Вы должны подождать несколько секунд, чтобы убедиться, что удаленный планировщик не пропустил событие полностью.
Существует эквивалент WMI и те же основные предостережения, что и в:
ЛИСТ 3: Код для создания Интерактивный процесс на машинах Windows Server 2003, Windows XP и Windows 2000 SP3
Const INTERVAL = "n"
Const MINUTES = 1
strComputer = "compaq575"
strCommand = "calc.exe"
Set objWMIService = _
GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objScheduledJob = objWMIService.Get("Win32_ScheduledJob")
Set objSWbemDateTime = _
CreateObject("WbemScripting.SWbemDateTime")
objSWbemDateTime.SetVarDate(DateAdd(INTERVAL, _
MINUTES, Now()))
intReturnValue = objScheduledJob.Create(strCommand, _
objSWbemDateTime.Value, False, 0, 0, True, intJobID)
WScript.Echo "Job ID: " & intJobID
Я думаю, что большинство других способов сделать это (без установки вашей собственной службы) было отключено различными пакетами обновления из-за уязвимостей.
Следующие два сообщения используют .NET для выполнения удаленных процессов.
Использование WMI
Пример Codeproject
http://www.codeproject.com/KB/IP/RemotingExec.aspx
Примеры выполняются с пользовательскими учетными данными и Надеюсь, это поможет.
Если группа enire находится под вашим контролем, возможно, удастся реализовать эти удаленные процессы как службы Windows. Служба может быть интерактивной (хотя и не по умолчанию), и ею можно удаленно управлять через стандартный диспетчер управления службами, работающий на каждом ПК с Windows.
Могу я спросить, зачем подчиненным процессам нужен графический интерфейс? У меня аналогичная настройка, но графический интерфейс мне нужен только во время первоначальной настройки.
В любом случае, вот что я сделал, но, к сожалению, он зависит от процесса, запущенного под учетной записью LocalSystem, которую, как я понимаю, вы пытаетесь избегайте, если вам действительно нужен графический интерфейс.
Чтобы дать вам небольшую справку, приложение, которое я должен был распространить, было Hudson , и это была более ранняя версия, в которой способ распространения заключается в запуске приложения Java WebStart и, следовательно, потребность в графическом интерфейсе пользователя (по крайней мере, во время настройки, чтобы помочь в устранении неполадок).
Я настроил подчиненное устройство приложения как службы на подчиненных машинах с помощью sc.exe (который является PITA, чтобы получить право, к счастью, вы делаете это только один раз). Что-то вроде:
sc.exe create SlaveService binPath= c:\path\to\slave.exe type= interact DisplayName= "The Slave Service"
Обратите внимание на пробелы после параметров (binPath = etc), они необходимы. Также обратите внимание, что мне было проще удалить "type = interact" и вручную изменить его в сервисной консоли.
Затем на главном компьютере, также используя sc.exe, я запускаю службу удаленно:
sc.exe \\slavemachine start SlaveService
И проверял, что программа работала на подчиненных машинах.
Теперь в моем случае мне действительно не требовался графический интерфейс, кроме как для первоначального устранения неполадок.
Чтобы это произошло, вам понадобится пара компонентов.
Во-первых, вам понадобится способ связи с удаленной машиной.
Во-вторых, вы на удаленной машине потребуется что-то, что может запустить ваше приложение.
Другие предложения, прежде всего, используют что-то встроенное для одного или обоих этих компонентов, что нормально, если ограничения любого из указанных подходящие решения.
PsExec выглядит как наиболее многообещающее готовое решение. В противном случае вы можете развернуть свое собственное приложение для прослушивания простых сообщений через TCP / именованные каналы / что угодно и просто создать соответствующие подпроцессы. Единственное предостережение: вы должны быть очень осторожны в вопросах безопасности, особенно если какая-либо из машин находится в открытом доступе.
Пакет PSTools был разработан Sysinternals и был настолько хорош, что через некоторое время компания была куплена Microsoft. Использование этих инструментов - лучший способ выполнить вашу задачу.
Я вижу, вы упомянули проблему с интерактивным запуском приложений. Могу я предложить использовать переключатель / i для интерактивного запуска приложения. PSTools предлагает все функции, которые вам нужны. Вам просто нужно поиграть с переключателями, чтобы получить желаемый результат.
Я никогда не испытывал такой медлительности, которую вы описываете в моих приложениях, использующих PSTools.