2017-02-24 34 views
0

我正在尝试使用Kryo串行器的火花来以较少的内存成本存储一些数据。而现在我遇到了一个麻烦,我无法使用Kryo串行器将DataFrame(类型为Dataset [Row])保存在内存中。我想我需要做的是org.apache.spark.sql.Row添加到classesToRegister,但仍然出现错误:出现这样的如何在Spark中使用Kryo串行器缓存DataFrame?

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

Dataset s不使用标准序列化方法。他们使用自己的压缩方法专门的柱状存储,所以你不需要存储你的数据集与Kryo串行器。

相关问题