在Spark Scala中将一个数据集中的一行添加到另一个数据集中

在Spark Scala中将一个数据集中的一行添加到另一个数据集中,scala,apache-spark,apache-spark-mllib,apache-spark-dataset,Scala,Apache Spark,Apache Spark Mllib,Apache Spark Dataset,有两个数据帧集,一个是“训练集”,另一个是“测试集”。我想做的是使用“训练集加上一行测试集”迭代一些算法(让我们调用AAA,它需要RDD输入格式),如下步骤 合并整个训练集+测试集的“第一”行 使用1的数据运行一些算法并得到一些结果 合并整个训练集+测试集的“第二”行 使用2的数据运行一些算法并得到一些结果 合并整个训练集+测试集的“第三”行。 …迭代到测试集的最后一行 实际上,在spark手册中,我已经检查过spark中的RDD和数据帧是不可变的,所以不可能使用 Testset.map( x

有两个数据帧集,一个是“训练集”,另一个是“测试集”。我想做的是使用“训练集加上一行测试集”迭代一些算法(让我们调用AAA,它需要RDD输入格式),如下步骤

  • 合并整个训练集+测试集的“第一”行
  • 使用1的数据运行一些算法并得到一些结果
  • 合并整个训练集+测试集的“第二”行
  • 使用2的数据运行一些算法并得到一些结果
  • 合并整个训练集+测试集的“第三”行。 …迭代到测试集的最后一行
  • 实际上,在spark手册中,我已经检查过spark中的RDD和数据帧是不可变的,所以不可能使用

    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 loop”。谢谢。

    不确定这是一个多么好的主意,但是:

    1) 在training dataframe上创建一个名为helper的新列,其值为-1

    2) 在测试数据框上创建一个名为helper的新列,如下所示:

    test.withColumn(“helper”,单调递增的id())

    3) 将2)的输出写入磁盘,以确保ID不会更改

    4) Union 1)与3)读回,然后缓存/持久化/写入磁盘并读回

    5) 编写一个过滤联合数据帧的循环,并执行以下逻辑:

    val data = unioned.filter($"helper" === lit(-1) || $"helper" === lit(n))
    val result = logic(data)
    

    其中n是循环的值,第一行测试从0开始

    我相信您想要的操作是
    折叠
    ,而不是
    映射
    。但是,事实上,
    Testset
    Trainset
    都是数据帧,这意味着这将不起作用,因为您将遇到序列化问题。您可以将这两个数据帧转换为rdd,并在测试数据中使用for循环,然后进行计算。简单。但请记住,您的逻辑不适用于分布式/并行计算