Java Spark:如何有效地从两个阵列中获取每一对?
输入就像Java Spark:如何有效地从两个阵列中获取每一对?,java,apache-spark,Java,Apache Spark,输入就像 [K1, Tuple(Array A, Array B)] [K2, Tuple(Array A, Array B)] [K3, Tuple(Array A, Array B)] 我想对输入做的是: 键:从值转换为每对值 值:使两个数组之间的每一对成为可能,并转换为键 完成此操作后,我希望得到以下结果: [(A[0],B[0]), K1] [(A[0],B[1]), K1] [(A[0],B[2]), K1] [(A[1],B[0]), K1] [(A[0],B[0]), K2]
[K1, Tuple(Array A, Array B)]
[K2, Tuple(Array A, Array B)]
[K3, Tuple(Array A, Array B)]
我想对输入做的是:
- 键:从值转换为每对值
- 值:使两个数组之间的每一对成为可能,并转换为键
[(A[0],B[0]), K1]
[(A[0],B[1]), K1]
[(A[0],B[2]), K1]
[(A[1],B[0]), K1]
[(A[0],B[0]), K2]
[(A[0],B[1]), K2]
[(A[0],B[0]), K3]
我使用flatMapToPair
来执行此操作flatMapToPair
返回一个输出,因此我必须将每个键、值对合并到如下列表中:
[K1, Tuple(Array A(size 2),Array B(size 2))]
== flatMapToPair=>
ArrayList{[(A[0],B[0]),K1],[(A[0],B[1]),K1],[(A[1],B[0]),K1],[(A[1],B[1]),K1]}
但是,在这种情况下,当输入数据太大时,输出(ArrayList)太大,无法使用RDD进行处理(RDD大小不能大于Spark中的
Integer.MAX_值
)。因此,我需要另一种方法来避免大的输出。您想要的输出丢失了[(A[1],B[1]),K1]
例如,这是故意的吗?如果是这样的话,你如何确定这是不需要的呢?我也不知道spark,但假设你想构建每一个可能的对,那么除了数组列表之外,任何东西的输出大小都应该几乎相等。因此,一种选择可能是采用流式方法,即只映射输入的一部分,将其传递给RDD,然后他们继续输入的下一部分。@Thomas我也需要[(a[1],B[1]),K1]。在示例中,省略了这一点。如果我正确理解第二个注释,您的意思是将数组A与数组B的一部分配对,对吗?哦我认为它有效!!非常感谢你,我会尝试一下。你可以这样做,或者只是在关键点处拆分,即先处理K1,然后处理K2等。我想你可以先尝试平面图,将其分成(K,数组a)和(K,数组B)对,然后尝试spark的笛卡尔积,但我不确定你想要的输出是否缺少处理[(a[1],B[1]),K1]
例如,这是故意的吗?如果是这样的话,你如何确定这是不需要的呢?我也不知道spark,但假设你想构建每一个可能的对,那么除了数组列表之外,任何东西的输出大小都应该几乎相等。因此,一种选择可能是采用流式方法,即只映射输入的一部分,将其传递给RDD,然后他们继续输入的下一部分。@Thomas我也需要[(a[1],B[1]),K1]。在示例中,省略了这一点。如果我正确理解第二个注释,您的意思是将数组A与数组B的一部分配对,对吗?哦我认为它有效!!非常感谢,我会尝试一下。你可以这样做,或者只是在关键点拆分,即先处理K1,然后处理K2等。我想你可以先尝试平面图,将其分成(K,数组a)和(K,数组B)对,然后尝试spark的笛卡尔积,但我不确定处理方法