如何在Spark中使用Kryo Serializer缓存DataFrame?

时间:2017-02-24 07:55:15

标签: apache-spark dataframe apache-spark-sql kryo

我正在尝试使用Spark和Kryo​​ Serializer以较少的内存成本存储一些数据。现在我遇到了麻烦,我无法使用Kryo序列化程序将DataFram e(其类型为Dataset [Row])保存在内存中。我认为我需要做的就是添加org.apache.spark.sql.Row to classesToRegister,但仍然会出现错误:

spark-shell --conf spark.kryo.classesToRegister=org.apache.spark.sql.Row --conf spark.serializer=org.apache.spark.serializer.KryoSerializer --conf spark.kryo.registrationRequired=true
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.types._
import org.apache.spark.sql.Row
import org.apache.spark.storage.StorageLevel

val schema = StructType(StructField("name", StringType, true) :: StructField("id", IntegerType, false) :: Nil)
val seq = Seq(("hello", 1), ("world", 2))
val df = spark.createDataFrame(sc.emptyRDD[Row], schema).persist(StorageLevel.MEMORY_ONLY_SER)
df.count()

错误发生如下: enter image description here

我不认为将byte[][]添加到classesToRegister是一个好主意。那么我应该怎么做才能用Kryo将数据帧存储在内存中?

1 个答案:

答案 0 :(得分:1)

Dataset不使用标准序列化方法。它们使用专门的柱状存储和自己的压缩方法,因此您无需将数据集与Kryo Serializer一起存储。