Package: datafushion-plugins-sparkpy
DataFushion_Plugins_SparkPy说明1.简介针对Spark的Python版本算法(pyspark)在DataFushion平台使用所给出的插件,主要用于规范化算法的输入输出2.通常算法使用Step1:引入datafushion_spark包中的operation模块Step2:使用资源管理器进行数据拆解处理,并在其中实现自己需要实现的业务算法逻辑fromdatafushion_sparkimportoperation,HandleDataFrameSet,HandleInputDataStruct,DataFrame,SparkSession,\FileExtractFormatEnumif__name__=='__main__':withoperation(app_name="AvgWindPowerByStatus",master="local")asdestruction:# type:HandleDataFrameSetinput_data_struct_list=destruction.input_data_struct_listmapping_flags=destruction.mapping_flagsparam_map=destruction.param_mapspark=destruction.spark# type:SparkSessiondata_result=None# type DataFrame# 算法逻辑部分forindex,input_data_structinenumerate(input_data_struct_list):# type: HandleInputDataStruct# 注意:此时的DataFrame的列名已经是映射过的列名,可以直接使用data_list=input_data_struct.data_list# type: DataFramedata_list.show()ifindex==0:data_result=data_list.groupby("status").agg({"power":"mean"}).withColumnRenamed("avg(power)","powerAvg")else:data_result=data_result.union(data_list.groupby("status").agg({"power":"mean"}).withColumnRenamed("avg(power)","powerAvg"))# 保存最终结果destruction.data_result=data_result# 保存存储的格式,需要与打包的配置文件对应destruction.output_type=FileExtractFormatEnum.JSON.value注意:如果是Windows开发的话需要在脚本文件前加入，findspark请自行下载，没有在包中做依赖管理importfindsparkfindspark.init()destruction为解构的HandleDataFrameSet实体类input_data_struct_list中包含了输入数据的封装,其类型为List其元素为HandleInputDataStruct类,包含的属性为file_type,file_path,file_input_mapping,data_list算法需要使用的是file_input_mapping和data_listdata_list是输入数据的DataFramefile_input_mapping为输入数据字段的映射spark为sparkSession对象mapping_flags为映射标识字典，key为每个单独输入的映射标识，key为输入映射param_map为算法的参数字典在对数据进行业务算法处理完成后,需要将拆解的destruction中的data_result属性赋值为业务算法的最终数据结果在对数据进行业务算法处理完成后,需要将拆解的destruction中的output_type属性赋值为业务算法需要输出的文件格式FileExtractFormatEnum.JSON.value中提供了JSON,CSV,PARQUET,GENERAL四类格式目前PARQUET类的输出格式只支持作为Spark类型的算法积木中的输入3.模型训练算法使用Step1:引入datafushion_spark包中的operation模块Step2:使用资源管理器进行数据拆解处理,并在其中实现自己需要实现的业务算法逻辑此处以鸢尾花训练为例进行逻辑回归模型训练fromdatafushion_sparkimportoperation,HandleDataFrameSet,HandleInputDataStruct,DataFrame,SparkSession,\FileExtractFormatEnum,TrainFiledEnum,TrainModelResultfrompyspark.ml.featureimportVectorAssemblerfrompyspark.ml.classificationimportLogisticRegression,LogisticRegressionModelfrompyspark.mlimportPipeline,PipelineModelif__name__=='__main__':withoperation(app_name="IrisClassify",mapping_data=False,master="local")asdestruction:# type:HandleDataFrameSetinput_data_struct_list=destruction.input_data_struct_listmapping_flags=destruction.mapping_flags# type: dictparam_map=destruction.param_mapspark=destruction.spark# type:SparkSessionalgo_iter=param_map['iter']algo_reg=param_map['reg']algo_elastic_net=param_map['elasticNet']mapping_list=[]fork,vinmapping_flags.items():mapping_list.append(v)data_result=None# 算法逻辑部分forindex,input_data_structinenumerate(input_data_struct_list):# type: HandleInputDataStruct# 注意:此时的DataFrame的列名已经是映射过的列名,可以直接使用data=input_data_struct.data_list# type: DataFramemapping=mapping_list[index]feature_fields=mapping[TrainFiledEnum.FEATURE.value]label_field=mapping[TrainFiledEnum.LABEL.value][0]train_data=data.withColumnRenamed(label_field,TrainFiledEnum.LABEL.value)featureAssembler=VectorAssembler().setInputCols(feature_fields).setOutputCol('features')logistic_regression=LogisticRegression().setMaxIter(algo_iter).setRegParam(algo_reg).setElasticNetParam(algo_elastic_net)pipeline_model:PipelineModel=Pipeline().setStages([featureAssembler,logistic_regression]).fit(train_data)# 将data_result实例化为一个TrainModelResult对象data_result=TrainModelResult(train_data=train_data,pipeline_model=pipeline_model)lg_model:LogisticRegressionModel=pipeline_model.stages[1]foriteminlg_model.summary.objectiveHistory:print(item)# 保存最终结果destruction.data_result=data_result# 保存存储的格式,需要与打包的配置文件对应destruction.output_type=FileExtractFormatEnum.MODEL.value注意:如果需要训练模型的话，一般情况下1.将operation中设置为mapping_data=False,因为一般我们需要自己根据标识来确定怎样处理特征数据2.将data_result需要设置为TrainModelResult实例，其中TrainModelResult包括的数据有train_data和pipeline_model，即训练数据和管道模型3.最后需要设置解构回调对象的output_type为model格式destruction.output_type = FileExtractFormatEnum.MODEL.value