![](/img/trans.png)
[英]From the following code how to convert a JavaRDD<Integer> to DataFrame or DataSet
[英]How to get/build a JavaRDD[DataSet]?
當我使用 deeplearning4j 並嘗試在 Spark 中訓練 model
public MultiLayerNetwork fit(JavaRDD<DataSet> trainingData)
fit() 需要一個 JavaRDD 參數,我嘗試像這樣構建
val totalDaset = csv.map(row => {
val features = Array(
row.getAs[String](0).toDouble, row.getAs[String](1).toDouble
)
val labels = Array(row.getAs[String](21).toDouble)
val featuresINDA = Nd4j.create(features)
val labelsINDA = Nd4j.create(labels)
new DataSet(featuresINDA, labelsINDA)
})
但 IDEA 的提示是No implicit arguments of type:Encode[DataSet]
這是一個錯誤,我不知道如何解決這個問題,
我知道 SparkRDD 可以轉換為 JavaRDD,但我不知道如何構建 Spark RDD[DataSet]
數據集在import org.nd4j.linalg.dataset.DataSet
它的構造方法是
public DataSet(INDArray first, INDArray second) {
this(first, second, (INDArray)null, (INDArray)null);
}
這是我的代碼
val spark:SparkSession = {SparkSession
.builder()
.master("local")
.appName("Spark LSTM Emotion Analysis")
.getOrCreate()
}
import spark.implicits._
val JavaSC = JavaSparkContext.fromSparkContext(spark.sparkContext)
val csv=spark.read.format("csv")
.option("header","true")
.option("sep",",")
.load("/home/hadoop/sparkjobs/LReg/data.csv")
val totalDataset = csv.map(row => {
val features = Array(
row.getAs[String](0).toDouble, row.getAs[String](1).toDouble
)
val labels = Array(row.getAs[String](21).toDouble)
val featuresINDA = Nd4j.create(features)
val labelsINDA = Nd4j.create(labels)
new DataSet(featuresINDA, labelsINDA)
})
val data = totalDataset.toJavaRDD
在 deeplearning4j 官方指南中由 Java 創建 JavaRDD[DataSet]:
String filePath = "hdfs:///your/path/some_csv_file.csv";
JavaSparkContext sc = new JavaSparkContext();
JavaRDD<String> rddString = sc.textFile(filePath);
RecordReader recordReader = new CSVRecordReader(',');
JavaRDD<List<Writable>> rddWritables = rddString.map(new StringToWritablesFunction(recordReader));
int labelIndex = 5; //Labels: a single integer representing the class index in column number 5
int numLabelClasses = 10; //10 classes for the label
JavaRDD<DataSet> rddDataSetClassification = rddWritables.map(new DataVecDataSetFunction(labelIndex, numLabelClasses, false));
我嘗試通過 scala 創建:
val JavaSC: JavaSparkContext = new JavaSparkContext()
val rddString: JavaRDD[String] = JavaSC.textFile("/home/hadoop/sparkjobs/LReg/hf-data.csv")
val recordReader: CSVRecordReader = new CSVRecordReader(',')
val rddWritables: JavaRDD[List[Writable]] = rddString.map(new StringToWritablesFunction(recordReader))
val featureColnum = 3
val labelColnum = 1
val d = new DataVecDataSetFunction(featureColnum,labelColnum,true,null,null)
// val rddDataSet: JavaRDD[DataSet] = rddWritables.map(new DataVecDataSetFunction(featureColnum,labelColnum, true,null,null))
// can not reslove overloaded method 'map'
調試錯誤信息:
DataSet 只是一對 INDArray。 (輸入和標簽)我們的文檔深入介紹了這一點: https://deeplearning4j.konduit.ai/distributed-deep-learning/data-howto
為了堆棧溢出,我將總結這里的內容,因為沒有“1”的方式來創建數據管道。 這與你的問題有關。 這與您在本地創建數據集的方式非常相似,通常您希望在本地執行任何操作並將其放入 function 中激發。
例如,CSV 和圖像將會非常不同。 但通常你使用 datavec 庫來做到這一點。 文檔總結了每種方法的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.