[英]Python Spark Job Optimization
我在一個Dataproc集群上運行PySpark(2.3)
該數據有近130萬行和4列,分別是:
Date,unique_id (Alphanumeric) , category(10 distinct values) and Prediction (0 or 1)
PS-這是時間序列數據
我們正在使用Facebook的先知模型進行預測建模,由於Prophet僅接受Pandas數據框作為輸入,因此以下是將Spark數據框轉換為Pandas數據框的操作。
def prediction_func(spark_df):
import pandas as pd
# Lines of code to convert spark df to pandas df
# Calling prophet model with the converted pandas df
return pandas_df
predictions = spark_df.groupby('category').apply(prediction_func)
整個過程在dataproc上花費大約1.5個小時。
我敢肯定,在應用prediction_func
之前,有更好的分組和分區方法。
任何建議將不勝感激。
由於您的代碼不依賴於分組變量,因此應完全刪除groupBy
並使用標量UDF代替Grouped Map。
這樣,您就不需要洗牌,並且可以利用數據局部性和可用資源。
您必須重新定義函數,以獲取所有必需的列並返回pandas.Series
:
def prediction_func(*cols: pandas.Series) -> pandas.Series:
... # Combine cols into a single pandas.DataFrame and apply the model
return ... # Convert result to pandas.Series and return
用法示例:
from pyspark.sql.functions import PandasUDFType, pandas_udf, rand
import pandas as pd
import numpy as np
df = spark.range(100).select(rand(1), rand(2), rand(3)).toDF("x", "y", "z")
@pandas_udf("double", PandasUDFType.SCALAR)
def dummy_prediction_function(x, y, z):
pdf = pd.DataFrame({"x": x, "y": y, "z": z})
pdf["prediction"] = 1.0
return pdf["prediction"]
df.withColumn("prediction", dummy_prediction_function("x", "y", "z")).show(3)
+-------------------+-------------------+--------------------+----------+
| x| y| z|prediction|
+-------------------+-------------------+--------------------+----------+
|0.13385709732307427| 0.2630967864682161| 0.11641995793557336| 1.0|
| 0.5897562959687032|0.19795734254405561| 0.605595773295928| 1.0|
|0.01540012100242305|0.25419718814653214|0.006007018601722036| 1.0|
+-------------------+-------------------+--------------------+----------+
only showing top 3 rows
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.