scala - 在 Spark Scala 中将一行从一个数据集添加到另一个数据集
问题描述
有两个 DataFrame 集,一个是“Training set”,另一个是“Test set”。我想要做的是通过使用“训练集加上一行测试集”来迭代一些算法(让我们调用 AAA,它需要 RDD 输入格式),遵循以下步骤。
- 合并整个训练集 + 测试集的“第一行”。
- 通过使用 1 的数据运行一些算法并得到一些结果。
- 合并整个训练集 + 测试集的“第二”行。
- 通过使用 2 的数据运行一些算法并得到一些结果。
- 合并整个训练集 + 测试集的“第三行”。…迭代直到测试集的最后一行。
实际上,在spark手册中,我检查过spark中的RDD和DataFrame是不可变的,所以无法使用
Testset.map( x => AAA(Trainset.union(x)) )
另外,我尝试使用
Testset.map( x => AAA(Trainset.union(Array(x.get(0).toString.toDouble, x.get(1).toString.toDouble, ... x.get(19).toString.toDouble))
但是,它不起作用:(。是否有任何解决方案可以使上述步骤成为可能?如果您对此问题有一个好主意,请帮助我。
// 修改和添加条件
由于耗时问题,我需要使用并行计算。因此,我不能使用“for 循环”。谢谢。
解决方案
不确定这是一个多么好的主意,但如何:
1) 在训练数据帧上创建一个名为 helper 的新列,其值为 -1
2)在测试数据框上创建一个名为 helper 的新列,如下所示:
test.withColumn("helper", monotonically_increasing_id())
3) 将 2) 的输出写入磁盘以确保 ids 永远不会改变
4)联合1)与3)读回,然后缓存/持久/写入磁盘并读回
5)编写一个循环过滤联合数据帧并执行逻辑:
val data = unioned.filter($"helper" === lit(-1) || $"helper" === lit(n))
val result = logic(data)
其中 n 是您要循环的值,从第一行测试的 0 开始
推荐阅读
- javascript - 在nodejs中将数字作为intiger插入mongodb
- windows - Delphi 和 Lazarus 中主菜单的不同视图
- reactjs - 意外的令牌,应为“;” 在渲染()
- android - 如何获取 Nativescript angular modal 的原生视图窗口的参考?
- switch-statement - 使用 Switch 和 JOptionPane
- vb.net - 检查访问数据库 vb.net
- javascript - 使用动态键和非动态创建动态对象
- jquery - 使用 kendo UI 绘制垂直折线图
- azure-ad-b2c - Azure B2C 自定义登录旅程 - 首先捕获电子邮件
- c++ - 为什么在循环中调用 std::getline 后 C++ fstream 需要调用 clear()