Apache spark 根据最小值对数据集进行分区&;另一个数据集的最大属性
我想解决的问题是:给定一个数据集作为输入,我想生成一个数据集列表。 输入数据集的数据集列表是使用某个属性的Min和Max值定义的,该属性通过考虑第二个数据集的Max和Min属性值构成子数据集列表,下面是我想要的示例:如果我们将飞行和以下两个数据集作为属性Flight: (一) 第二个数据集如下所示: (二) 然后,根据Flight属性,给定数据集2的Min值为111,则分割数据集1产生的数据集恢复列表为:Apache spark 根据最小值对数据集进行分区&;另一个数据集的最大属性,apache-spark,Apache Spark,我想解决的问题是:给定一个数据集作为输入,我想生成一个数据集列表。 输入数据集的数据集列表是使用某个属性的Min和Max值定义的,该属性通过考虑第二个数据集的Max和Min属性值构成子数据集列表,下面是我想要的示例:如果我们将飞行和以下两个数据集作为属性Flight: (一) 第二个数据集如下所示: (二) 然后,根据Flight属性,给定数据集2的Min值为111,则分割数据集1产生的数据集恢复列表为: TicketId | Flight | time |
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
语句的范围内,或在它之外,具体取决于您想做什么)//将'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)
}