Apache spark 根据最小值对数据集进行分区&;另一个数据集的最大属性

Apache spark 根据最小值对数据集进行分区&;另一个数据集的最大属性,apache-spark,Apache Spark,我想解决的问题是:给定一个数据集作为输入,我想生成一个数据集列表。 输入数据集的数据集列表是使用某个属性的Min和Max值定义的,该属性通过考虑第二个数据集的Max和Min属性值构成子数据集列表,下面是我想要的示例:如果我们将飞行和以下两个数据集作为属性Flight: (一) 第二个数据集如下所示: (二) 然后,根据Flight属性,给定数据集2的Min值为111,则分割数据集1产生的数据集恢复列表为: TicketId | Flight | time |

我想解决的问题是:给定一个数据集作为输入,我想生成一个数据集列表。 输入数据集的数据集列表是使用某个属性的MinMax值定义的,该属性通过考虑第二个数据集的MaxMin属性值构成子数据集列表,下面是我想要的示例:如果我们将飞行和以下两个数据集作为属性Flight:

(一)

第二个数据集如下所示:

(二)

然后,根据Flight属性,给定数据集2的Min值为111,则分割数据集1产生的数据集恢复列表为:

  TicketId | Flight |           time       |
    ---------------------------------------|
      10   |    123 |   2020-11-27 05:48:02|
    ---------------------------------------|
      155  |    125 |   2020-11-27 05:49:02|
    ---------------------------------------|
      12   |    133 |   2020-11-27 05:50:02|
    ---------------------------------------|

因为数据集2的值Min将相应地将数据集1拆分为两个结果数据集。 我的问题是如何在Spark/Java(甚至Scala)中实现这一点。 注意:分区值(属性飞行)可能是(数据集2)属性的最大值

感谢您的帮助。

第一件事(因为数据帧和数据集都是从RDD派生的,所以也适用于它们)。这意味着我们不能在第一个数据集的顶部使用
方法的一行,其中
/
过滤器
方法将其拆分。相反,我们可以切入重点,使用基于两个数据集的
Flight
的最小/最大值的条件来确定a)我们将基于的值,以及b)分割数据集的数量(仅因为您有一个条件,我们希望有3个而不是2个分割数据集)

因为我们知道存在3种重叠最小/最大值的有效情况:

  • 最小值(df2)
    拆分:
  • 最大值(df2)
    拆分:
  • min(df2)
    max(df2)
    拆分:
剩下要做的就是:

  • 从两个数据集中查找最大值和最小值
    Flight
  • 在一系列
    if
    /
    else if
    语句中使用它们,以确定我们从输入数据中得到的值重叠情况,以及
  • 通过一次通过一个简单的
    where
    方法过滤第一个数据集,创建2或3个新数据集(在
    if
    /
    else if
    语句的范围内,或在它之外,具体取决于您想做什么)
  • 下面是用Scala编写的代码,以供Spark中更广泛的将来参考。(当然,您可以在Java中实现它,只需稍作更改,因为Spark语言端口之间的大多数命令都是可互换的):

    //将'Flight'的最小/最大值存储为整数
    val df1Max=df1.select(max(“Flight”).head().getInt(0)
    val df1Min=df1.select(min(“Flight”).head().getInt(0)
    val df2Max=df2.select(max(“Flight”).head().getInt(0)
    val df2Min=df2.select(min(“Flight”).head().getInt(0)
    if(df1Mindf2Min&&df1Mindf2Min&&df2Max
    您说,根据航班属性,数据集2的最大值为89,但在第二个数据集的
    Flight
    列中没有
    89
    (最小值也是如此,因为当有
    111
    时,您将
    187
    指示为最小值)。另外,我不太明白你最后一段的意思。哪个值可以/应该用于划分第一个数据集?数据集2的最小值?数据集2的最大值?第一个数据集的最小值/最大值在哪里使用?我更新了这个问题,对于最大值/最小值,在这里根据数据集2的最小值进行分割,因为数据集2的最小值在数据集1的[min,max]范围内。如果数据集的最大值在数据集1的[Min,max]范围内,则将根据数据集1的最大值进行拆分。如果数据集2的最小值和最大值都在数据集1的[Min,max]范围内,则需要进行两次拆分,所得数据集计数将为3(而不是2)希望它是清楚的。另一个最后的快速问题:如果数据集1的拆分部分必须根据其他数据集3进行另一个拆分过程,我该怎么办?在这种情况下,您可以在每个
    if
    代码块中的每个案例中执行相同的精确过程。这将是漫长的,不那么好看,但它可以完成工作。另一个解决方案是将分割的部分单独存储到磁盘,但是我不建议您这样做,因为这会大大降低速度。尽可能多地将数据保存在内存中。
      TicketId | Flight |           time       |
        ---------------------------------------|
          103  |    156 |   2020-11-27 05:48:02|
        ---------------------------------------|
          154  |    130 |   2020-11-27 05:49:02|
        ---------------------------------------|
          123  |    151 |   2020-11-27 05:50:02|
        ---------------------------------------|
          220  |    119 |   2020-11-27 06:49:02|
        ---------------------------------------|
          143  |    111 |   2020-11-27 06:50:02|
        ---------------------------------------|
          16   |    189 |   2020-11-27 05:51:02|
        ---------------------------------------|
          22   |    152 |   2020-11-27 05:49:02|
        ---------------------------------------|
          22   |    125 |   2020-11-27 05:50:02|
        ---------------------------------------|
          134  |    187 |   2020-11-27 05:51:02|
        ---------------------------------------
    
      TicketId | Flight |           time       |
        ---------------------------------------|
          10   |    123 |   2020-11-27 05:48:02|
        ---------------------------------------|
          155  |    125 |   2020-11-27 05:49:02|
        ---------------------------------------|
          12   |    133 |   2020-11-27 05:50:02|
        ---------------------------------------|
    
          TicketId | Flight |           time       |
            ---------------------------------------|
              200  |    13  |   2020-11-27 06:49:02|
            ---------------------------------------|
              123  |    22  |   2020-11-27 06:50:02|
            ---------------------------------------|
              15   |    92  |   2020-11-27 05:51:02|
            ---------------------------------------|
              21   |    41  |   2020-11-27 05:49:02|
            ---------------------------------------|
              22   |    27  |   2020-11-27 05:50:02|
            ---------------------------------------|
              422   |    35 |   2020-11-27 05:51:02|
            ---------------------------------------
    
    min(df1)------------------------------------max(df1)
                   min(df2)----------------------------------max(df2)
    
    min(df1)----------------------------------max(df1)
                   min(df2)------------------------------------max(df2)
    
    min(df1)-----------------------------------------------max(df1)
                   min(df2)----------------max(df2)
    
    // store the min/max values of `Flight` as integers
    val df1Max = df1.select(max("Flight")).head().getInt(0)
    val df1Min = df1.select(min("Flight")).head().getInt(0)
    val df2Max = df2.select(max("Flight")).head().getInt(0)
    val df2Min = df2.select(min("Flight")).head().getInt(0)
    
    if(df1Min < df2Min && df2Min < df1Max && df1Max < df2Max) // split by min(df2Min)
    {
        val firstDf = df1.where(col("Flight") <= df2Min)
        val secondDf = df1.where(col("Flight") > df2Min)
    
        firstDf.show()
        secondDf.show()
    
        // ... (store them in disk, process them, do whatever you want)
    }
    else if(df1Min > df2Min && df1Min < df2Max && df2Max < df1Max) // split by min(df2Max)
    {
        val firstDf = df1.where(col("Flight") <= df2Max)
        val secondDf = df1.where(col("Flight") > df2Max)
    
        firstDf.show()
        secondDf.show()
    
        // ... (store them in disk, process them, do whatever you want)
    }
    else if(df1Min > df2Min && df2Max < df1Max) // split by min(df2Min) and max(df2Max)
    {
        val firstDf = df1.where(col("Flight") <= df2Min)
        val secondDf = df1.where(col("Flight") >= df2Min && col("Flight") <= df2Max)
        val thirdDf = df1.where(col("Flight") > df2Max)
    
        firstDf.show()
        secondDf.show()
        thirdDf.show()
    
        // ... (store them in disk, process them, do whatever you want)
    }