在 RDD 中存储数组的有效方法
Efficient way to store an array in a RDD
我需要在 RDD 中存储类型数组。为此,我使用 Hadoop 中的 ArrayWritable class
:
static public class Record {
public long id;
public FloatArrayWritable dataArray;
}
它有效,但我想确保对象在不需要时不会被序列化。我想尽可能地留在记忆中。 Spark 和 Flink 声称将数据保存在内存中。
ArrayWritable class 是这样吗?这是存储数组的有效方法吗?
谢谢!
编辑: 来自@mattinbits 的回答,对于 Spark,有效的方法是使用 Java array 或 ArrayList (用于动态调整大小)
在 Spark 中,java.util.ArrayList
应该可以正常工作。我测试过的 Scala 示例:
import org.apache.spark.{SparkContext, SparkConf}
import java.util
case class Foo(val a: Int, val b: util.ArrayList[Int])
val conf = new SparkConf().setMaster("local").setAppName("example")
val sc = new SparkContext(conf)
val arr = new util.ArrayList[Int]()
arr.add(1)
val par = sc.parallelize[Foo](List(Foo(1, arr), Foo(2, arr), Foo(2, arr), Foo(3, arr), Foo(3, arr)))
我需要在 RDD 中存储类型数组。为此,我使用 Hadoop 中的 ArrayWritable class :
static public class Record {
public long id;
public FloatArrayWritable dataArray;
}
它有效,但我想确保对象在不需要时不会被序列化。我想尽可能地留在记忆中。 Spark 和 Flink 声称将数据保存在内存中。 ArrayWritable class 是这样吗?这是存储数组的有效方法吗? 谢谢!
编辑: 来自@mattinbits 的回答,对于 Spark,有效的方法是使用 Java array 或 ArrayList (用于动态调整大小)
在 Spark 中,java.util.ArrayList
应该可以正常工作。我测试过的 Scala 示例:
import org.apache.spark.{SparkContext, SparkConf}
import java.util
case class Foo(val a: Int, val b: util.ArrayList[Int])
val conf = new SparkConf().setMaster("local").setAppName("example")
val sc = new SparkContext(conf)
val arr = new util.ArrayList[Int]()
arr.add(1)
val par = sc.parallelize[Foo](List(Foo(1, arr), Foo(2, arr), Foo(2, arr), Foo(3, arr), Foo(3, arr)))