2017-02-24 3 views
0

Ich versuche, Funke mit Kryo Serializer zu verwenden, um einige Daten mit weniger Speicherkosten zu speichern. Und jetzt stoße ich auf ein Problem, ich kann einen DataFrame (dessen Typ Dataset [Row] ist) nicht im Speicher mit Kryo Serializer speichern. Ich dachte, alles, was ich tun müssen, ist org.apache.spark.sql.Row zu classesToRegister hinzufügen, aber Fehler immer noch auftritt:Wie kann ich DataFrame mit Kryo Serializer in Spark cachen?

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() 

Fehler wie dies der Fall ist: enter image description here

Ich glaube nicht, Hinzufügen von byte[][] zu classesToRegister ist eine gute Idee. Was sollte ich tun, um einen Datenrahmen mit Kryo im Speicher zu speichern?

Antwort

1

Dataset s keine Standard-Serialisierungsmethoden verwenden. Sie verwenden spezialisierten Spaltenspeicher mit eigenen Komprimierungsmethoden, sodass Sie Ihr Dataset nicht mit dem Kryo-Serializer speichern müssen.