将数据帧从 Spark 转换为 DL4j 使用的类型

Posted

技术标签:

【中文标题】将数据帧从 Spark 转换为 DL4j 使用的类型【英文标题】:Converting Dataframe from Spark to the type used by DL4j 【发布时间】:2018-09-18 15:13:20 【问题描述】:

有没有什么方便的方法可以将 Spark 中的 Dataframe 转换为 DL4j 使用的类型?目前在 DL4j 算法中使用 Daraframe 我得到一个错误: “类型不匹配,预期:RDD[DataSet],实际:Dataset[Row]”。

【问题讨论】:

没有使用 dl4j 的经验来写答案,但这有帮助吗? github.com/deeplearning4j/dl4j-examples/blob/master/… 不完全是。它不使用 Spark 的 Dataframe,而是使用 MnistDataSetIterator。一般来说,我找到了一些关于如何构建 DataSet 的示例,但我不知道这是否足够。我认为可能在已经存在的 API 中有一些实现,我没有看到。 你能尝试用sparkContext.parallelize(yourDataFrame) 并行化你的Dataframe,这应该创建RDD[DataSet] 吗? sparkContext 是 2.x 中 SparkSession 和 1.x 中 sc 的一部分 据我所知Dataframe 不需要并行化,因为它是分布式数据类型(我什至收到关于不兼容类型的警告)。另外,Dataset 是来自的类型Spark,以及来自org.nd4j.linalg.dataset.DataSetDataSet 大家好,这里使用数据集迭代器的 cmets 是错误的。请不要将其与火花一起使用。如果您打算将 dl4j 与柱状数据一起使用,则需要在示例中超越 hello world。 实际上查看的更好示例是数据 vec 示例:github.com/deeplearning4j/dl4j-examples/blob/master/… 【参考方案1】:

一般来说,我们为此使用 datavec。如果您愿意,我可以为您指出示例。数据框做了太多假设,使其太脆弱而无法用于现实世界的深度学习。

除此之外,数据框通常不是表示线性代数的良好抽象。 (例如在处理图像时它会掉下来)

我们在这里与 spark.ml 进行了一些互操作:https://github.com/deeplearning4j/deeplearning4j/blob/master/deeplearning4j/deeplearning4j-scaleout/spark/dl4j-spark-ml/src/test/java/org/deeplearning4j/spark/ml/impl/SparkDl4jNetworkTest.java

但总的来说,数据集只是一对 ndarray,就像 numpy 一样。如果您必须使用火花工具,并且只想在最后一英里使用 ndarray,那么我的建议是让数据框匹配某种形式的纯数字模式,将其映射到 ndarray“行”。

一般来说,我们这样做的一个重要原因是因为我们所有的 ndarray 都在堆外。 Spark 在处理数据管道和将 JVM 用于不应该做的事情(矩阵数学)方面有很多限制 - 我们采用了不同的方法,使我们能够有效地使用 gpus 和一堆其他东西。

当我们进行转换时,它最终会变成: 原始数据 -> 数值表示 -> ndarray

可以做的是将数据帧映射到双精度/浮点数组,然后使用 Nd4j.create(float/doubleArray) 或者您也可以这样做: someRdd.map(inputFloatArray -> new DataSet(Nd4j.create(yourInputArray),yourLabelINDARray))

这会给你一个“数据集”你需要一对匹配你的输入数据和标签的ndarrays。 那里的标签与您要解决的问题类型有关,无论是分类还是回归。

【讨论】:

以上是关于将数据帧从 Spark 转换为 DL4j 使用的类型的主要内容,如果未能解决你的问题,请参考以下文章

使用python将数据帧从十六进制转换为二进制

将数据帧从 pandas 转换为 pyspark 到 Foundry 的数据类型

将大型 Spark 数据帧从数据块写入 csv 失败

将数据转换为 spark scala 中的类对象列表

将数据帧从长转换为宽,同时保留值的顺序(dtype datetime)

使用熊猫将数据帧从长到宽转换-单行输出