首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Apache中尝试将Dataframe写入CSV时的不一致行为

在Apache中尝试将Dataframe写入CSV时的不一致行为
EN

Stack Overflow用户
提问于 2020-05-10 21:45:49
回答 1查看 139关注 0票数 0

我正在尝试输出决策树分类器的最佳超参数,我使用星火的MLlib训练到一个csv文件,使用Dataframes和火花-csv。下面是我的代码片段:

代码语言:javascript
复制
// Split the data into training and test sets (10% held out for testing)
val Array(trainingData, testData) = assembledData.randomSplit(Array(0.9, 0.1))

// Define cross validation with a hyperparameter grid
val crossval = new CrossValidator()
    .setEstimator(classifier)
    .setEstimatorParamMaps(paramGrid)
    .setEvaluator(new BinaryClassificationEvaluator)
    .setNumFolds(10)

// Train model
val model = crossval.fit(trainingData)

// Find best hyperparameter combination and create an RDD 
val bestModel = model.bestModel
val hyperparamList = new ListBuffer[(String, String)]()
bestModel.extractParamMap().toSeq.foreach(pair => {
    val hyperparam: Tuple2[String,String] = (pair.param.name,pair.value.toString)
    hyperparamList += hyperparam
})
val hyperparameters = sqlContext.sparkContext.parallelize(hyperparamList.toSeq)

// Print the best hyperparameters 
println(bestModel.extractParamMap().toSeq.foreach(pair => {
    println(s"${pair.param.parent} ${pair.param.name}")
    println(pair.value)
}))

// Define csv path to output results
var csvPath: String  = "/root/results/decision-tree"
val hyperparametersPath: String = csvPath+"/hyperparameters"
val hyperparametersFile: File = new File(hyperparametersPath)
val results = (hyperparameters, hyperparametersPath, hyperparametersFile)

// Convert RDD to Dataframe and write it as csv 
val dfToSave = spark.createDataFrame(results._1.map(x => Row(x._1, x._2)))
dfToSave.write.format("csv").mode("overwrite").save(results._2)

// Stop spark session
spark.stop()

在完成一项星火任务后,我可以看到部分-00*.和路径中的_SUCCESS文件,如预期的那样。然而,尽管在这种情况下总共有13个超参数(通过在屏幕上打印来确认),但cat-ing csv文件显示并非每个超参数都被写入csv:

代码语言:javascript
复制
user@master:~$ cat /root/results/decision-tree/hyperparameters/part*.csv
checkpointInterval,10
featuresCol,features
maxDepth,5
minInstancesPerNode,1

此外,在每次执行中都会得到书面更改的超参数。这是在一个基于HDFS的星火集群上执行的,其中有一个主服务器和3个拥有完全相同硬件的工作人员。会不会是比赛条件?如果是的话,我该如何解决呢?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-11 01:50:13

我想我想明白了。我希望dfTosave.write.format("csv")save(path)将所有内容写入主节点,但是由于任务是分发给所有工作人员的,所以每个工作人员都将其部分的超参数保存到其文件系统中的本地CSV。因为在我的示例中,主节点也是一个工作节点,所以我可以看到它在超参数中的一部分。“不一致行为”(即在每次执行中看到不同的部分)是由Spark用于在工作人员之间分配分区的任何算法造成的。

我的解决方案将是从所有员工那里收集CSV,使用像scprsync这样的工具来构建完整的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61719166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档