当前位置: 首页 > 知识库问答 >
问题:

如何从数据集中创建所有可能的行组合

逄念
2023-03-14

假设我有一个数据集:

+----+----+----+-----+----+
||col0|col2|col2|col3|col4|
+----+----+----+-----+----+
|   t0|  10| 100|cat26|30.9|
|   t1|  20| 200|cat13|22.1|
|   t2|  30| 300|cat26|30.9|
|   t3|  40| 400|cat26|30.9|
|   t4|  50| 500|cat15|15.3|
|   t5|  60| 600|cat13|22.1|
+----+----+----+-----+----+

我使用选择一个子数据集,其中()

  Dataset<Row> subDf = dF.where("col3 = cat26 ");

屈服:

     +----+----+----+-----+----+
     |col0|col2|col2|col3 |col4|
     +----+----+----+-----+----+
     |  t0|  10| 100|cat26|30.9|
     |  t2|  30| 300|cat26|30.9|
     | t3 |  40| 400|cat26|30.9|
     +----+----+----+-----+----+

我想使用这三行创建不同的组合,为每个组合形成一个数据集。

组合的示例如下:

     +----+----+----+-----+----+
     |col0|col2|col2|col3 |col4|
     +----+----+----+-----+----+
     |  t0|  10| 100|cat26|30.9|
     |  t2|  30| 300|cat26|30.9|
     +----+----+----+-----+----+

另一个是:

 +----+----+----+-----+----+
 |col0|col2|col2|col3 |col4|
 +----+----+----+-----+----+
 |  t2|  30| 300|cat26|30.9|
 |  t3|  40| 400|cat26|30.9|
 +----+----+----+-----+----+

第三种可能的组合如下:

     +----+----+----+-----+----+
     |col0|col2|col2|col3 |col4|
     +----+----+----+-----+----+
     |  t0|  10| 100|cat26|30.9|
     |  t3|  40| 400|cat26|30.9|
     +----+----+----+-----+----+

最后:

     +----+----+----+-----+----+
     |col0|col2|col2|col3 |col4|
     +----+----+----+-----+----+
     |  t0|  10| 100|cat26|30.9|
     |  t2|  30| 300|cat26|30.9|
     | t3 |  40| 400|cat26|30.9|
     +----+----+----+-----+----+

PS:在前面的示例中,每个组合(一个数据集)至少有两行,

如何在JAVA中实现这一点?非常感谢。

共有1个答案

贲功
2023-03-14

首先,最后一个与t0t2t3行的组合与使用where方法的简单查询中的输出相同,因此我们需要关注需要找到的其他唯一对:

  • {t0,t2}

对于每个组合,我们基本上需要使用where方法再次对给定的数据帧执行查询,因为我们实际上可以指定要返回一个列表,其中包含通过SQL从一列中匹配一个或多个值的所有行,如其中col0==t0或col0==t2。这意味着我们需要在where方法之后隔离并检索col0的行值列表,该方法用于过滤col3中所有不匹配的cat26(Java代码片段基于用户12910640的此答案)。

// Scala
val rowList = input.where("col3 == \"cat26\"")
          .select("col0")
          .rdd
          .map(row => row(0).toString)
          .collect()
          .toList

// Java
List<String> rowList = input.toJavaRDD()
          .where("col3 == \"cat26\"")
          .select("col0")
          .map(new Function<Row, String>() {
              public String call(Row row) {return row.getAs("column_name").toString();}
}).collect();

rowList包含三个元素:t0t2t3。这意味着我们只需要以一种不存在重复对(例如{t0,t2}{t2,t0})的方式遍历这个列表,并且不存在具有相同元素的对(例如{t0,t0})。为了消除这两种情况,我们只需为每个第一次迭代使用第二个迭代循环,扫描第一次迭代的当前元素之后的每个元素(通过查看代码,您可以更好地理解它),并在执行对数据帧的查询之前,检查迭代的索引ij

// Scala
for(i <- 0 until rowList.size)
{
    for(j <- i until rowList.size)
    {
        if(!rowList(i).equals(rowList(j)))
            input.where("col0 == \"" + rowList(i) + "\" OR col0 == \"" + rowList(j) + "\"").show()
    }
}

// Java
for(int i = 0; i < rowList.size(); i++)
{
    for(int j = i; j < rowList.size(); j++)
    {
        if(!rowList(i).equals(rowList(j)))
            input.where("col0 == \"" + rowList.get(i) + "\" OR col0 == \"" + rowList.get(j) + "\"").show()
    }
}

通过这个循环,我们可以在控制台中看到所需的输出数据帧。

+----+----+----+-----+----+
|col0|col1|col2| col3|col4|
+----+----+----+-----+----+
|  t0|  10| 100|cat26|30.9|
|  t2|  30| 300|cat26|30.9|
+----+----+----+-----+----+

21/04/27 16:15:47 INFO BlockManagerInfo: Removed broadcast_0_piece0 on 192.168.2.5:36343 in memory (size: 4.1 KiB, free: 292.8 MiB)
+----+----+----+-----+----+
|col0|col1|col2| col3|col4|
+----+----+----+-----+----+
|  t0|  10| 100|cat26|30.9|
|  t3|  40| 400|cat26|30.9|
+----+----+----+-----+----+

+----+----+----+-----+----+
|col0|col1|col2| col3|col4|
+----+----+----+-----+----+
|  t2|  30| 300|cat26|30.9|
|  t3|  40| 400|cat26|30.9|
+----+----+----+-----+----+

或者,您可以尝试将这些输出与第一个匹配t0t2t3行的输出一起存储在DataFrame列表中,而不仅仅是将它们显示给控制台。

 类似资料:
  • 我如何从"CSV示例"创建一个像"最终结果"这样的数组? 背景 我正在构建一个用于测试的实验室文件系统,我想创建一个看起来有点像真实文件系统的文件夹结构。我有几个包含文件夹信息的CSV文件。 我想采用上面的每个组合,创建一个包含以下所有文件夹的文件系统。 一旦我有了上面所有完整路径的数组,就像做一样简单: 问题 我希望能够为任何CSV文件做到这一点,不管我有多少列,头名称是什么,或者每列有多少值。

  • 我有一个包含加密符号列表的数组,例如(因为有一千多个) 我需要创建一个多维数组,包含所有可能的组合,例如。 生成的数组不应该有重复的排列,如, 我真的不知道从哪里开始。我能得到的最接近的方法是用一些对构建一个数组(然后,不是写出来的,目标是逐渐搜索并添加缺少的组合): 任何帮助都将不胜感激。我的项目的其余部分是用Python 3.8编写的。

  • 问题内容: 我需要获取数组的所有可能的子集,其中至少要包含2个项目,而最大未知数。有人可以帮助我一点吗? 说我有这个… …我怎么得到这个? 问题答案: 窃取此JavaScript组合生成器后,我添加了一个参数以提供最小长度,从而, 要使用,提供一个数组以及所需的最小子集长度, 输出是

  • 我有一个数字数组,现在我必须通过生成给定数组的所有可能子数组并应用一些条件来找到元素之和。 条件是,对于每个子阵列,获取最小值,并找到其中的元素总数,然后将两者相乘(最小值*总数)。最后,将所有子阵列的所有这些相乘值相加。 以下是问题陈述: 使用下面的公式找到所有可能的子数组的总和: 和(左,右)=(最小的arr[i]) * (∑ arr[i]),其中i的范围从左到右。 例子: 子数组是:[sta

  • 问题内容: 目前,我试图让所有可能的组合从的,是每一个元素只包含一个字母。 在本身包含相同字母两次甚至更多,他们只应该,因为他们经常会出现使用。 在稍后应该含有最多的给定的长度从最小的2个字母的所有组合。 我在此处搜索了stackoverflow,但只发现了忽略以下事实的置换函数:每个字母仅在出现时才经常使用。 这是我的第一个Swift 2项目,所以请原谅我的绿色态度:) 我想要的是 我目前的做法