【问题标题】:How to get/build a JavaRDD[DataSet]?如何获取/构建 JavaRDD[DataSet]?
【发布时间】:2020-11-09 00:25:43
【问题描述】:

当我使用 deeplearning4j 并尝试在 Spark 中训练模型时

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'

调试错误信息:

【问题讨论】:

    标签: rdd apache-spark-dataset nd4j


    【解决方案1】:

    DataSet 只是一对 INDArray。 (输入和标签) 我们的文档深入介绍了这一点: https://deeplearning4j.konduit.ai/distributed-deep-learning/data-howto

    为了堆栈溢出,我将总结一下这里的内容,因为没有“1”的方式来创建数据管道。这与你的问题有关。这与您在本地创建数据集的方式非常相似,通常您希望在本地执行任何操作并将其放入函数中。

    例如,CSV 和图像将非常不同。但通常你使用 datavec 库来做到这一点。文档总结了每种方法。

    【讨论】:

    • 谢谢你的回复,但是我只在你的文档中找到了Java实现,你能告诉我如何在scala中实现,这是我读取csv文件内容的代码跨度>
    • Scala 可以使用 java 类。没有那么大的区别。不幸的是,我们没有大量的 scala 示例(我们清除了很多旧示例)。如果您愿意,欢迎您贡献一些,否则您必须自己将 java 映射到 scala。
    • 我尝试使用scala来映射文档中的java代码,但是在最后一行代码中说map函数不能重载。我评论了这一行并对其进行了调试,但产生了错误。我重新编辑了原始问题中的具体内容。我希望能得到你的答复。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多