Различный вывод кода Pyspark для одного и того же набора данных при нескольких запусках - PullRequest
0 голосов
/ 20 мая 2019

Я написал одну функцию pyspark, но когда я запускаю ее несколько раз, она дает мне каждый раз разные выходы для одного и того же набора входных данных.

-pyspark Function

def give_percentile(plat,metrics,perc):
df_perc = df_final.filter(df_final.platform.like('%' + plat + '%'))
df_perc = df_perc.filter(df_final[metrics]!=0)
percentile_val = df_perc.approxQuantile(metrics, [perc], 0.05)
if len(percentile_val)>0:
    percentile_val = float(percentile_val[0])
else:
    percentile_val = float(0)
return percentile_val

Вызов функции-

   df_agg = sqlContext.createDataFrame([Row(platform='iOS',
                                        percentile_page_load_50=give_percentile("iOS","page_load",0.5),
                                        percentile_time_diff_50=give_percentile("iOS","session_duration",0.5)),
                                        Row(platform='Android',
                                        percentile_page_load_50=give_percentile("Android","page_load",0.5),
                                        percentile_time_diff_50=give_percentile("Android","session_duration",0.5)),
                                        Row(platform='Web',
                                        percentile_page_load_50=give_percentile("Web","page_load",0.5),
                                        percentile_time_diff_50=give_percentile("Web","session_duration",0.5)))

Spark Job Submit: -

    spark-submit --deploy-mode cluster  --executor-cores 4 --executor-memory 12G --driver-cores 4 --driver-memory 12G --conf spark.driver.extraJavaOptions=-Duser.timezone=UTC --conf spark.executor.extraJavaOptions=-Duser.timezone=UTC "path"

мы храним вывод кода pyspark в формате файла паркета, и поверх него мы создаем таблицу impala, как показано ниже:

1.Выберите a.percentile_page_load_50, a.percentile_time_diff_50 из Tablename1 a, где a.platform = 'Colvalue' и a.dt = '20190501' limit 5;Количество записей в таблице = 22093826

Выход = 0.62400001287460327 0.35100001096725464

2. Выберите a.percentile_page_load_50, a.percentile_time_diff_50 из Tablename2 a, где a.platform = 'Colvalue' и a90dпредел 5;Количество записей таблицы = 22093826

output = 0.61500000953674316 0.28499999642372131 3. выберите a.percentile_page_load_50, a.percentile_time_diff_50 из Tablename3 a, где a.platform = 'Colvalue' и a.dt = '20190501' limit 5;Число записей таблицы = 22093826

output = 0.61799997091293335
0.27799999713897705

теперь здесь Tablename1, Tablename2 и Tablename3 создаются для вывода нескольких прогонов кода pyspark для одного и того же набора входных данных.но все же значения различны, так как наш код pyspark работает в режиме cluser / распределенном режиме.Когда мы проверили образцы данных в автономном режиме, их значения не изменились.Не могли бы вы помочь мне здесь и скажите, что не так в приведенном выше коде функции или какой-либо другой проблеме с кластером?

1 Ответ

0 голосов
/ 20 мая 2019

Функция приблизительное количество дает приблизительное решение в зависимости от заданной относительной ошибки.Вы устанавливаете допустимый относительный уровень ошибки для функции приблизительно 0.05, что означает, что он является только детерминированным со следующими границами:

"Если DataFrame имеет N элементов и если мы запрашиваем квантиль с вероятностью p вплоть до ошибки,тогда алгоритм вернет выборку x из кадра данных, так что точный ранг x будет близок к (p * N). "(Я выделил часть, почему вы получаете разные результаты).

Вы должны установить относительную ошибку на 0.0, если вам нужны точные квантили, но это также увеличивает время выполнения.Дополнительную информацию можно найти в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...