2016-06-15 12 views
2

jsonに(Java)Spark Dataframeを書きます。列の1つは、mllibスパースベクトルです。後でjsonファイルを2番目のDataframeに読み込みますが、スパースベクトル列はWrappedArrayになり、2番目のデータフレームではスパースベクトルとして読み取られません。私の質問:ラップされた配列ではなく、疎なベクトル列を得るために、私が書く面や読書面でできることは何ですか?Spark DataframeをJSONに書き込むと、MLLIBスパースベクトルのフォーマットが失われます

執筆:

initialDF.coalesce(1).write().json("initial_dataframe"); 

読書:

DataFrame secondDF = hiveContext.read().json("initial_dataframe"); 
+0

は直列化可能なベクトルですか? – Tschallacka

+0

ベクトルの内容(サイズ、インデックス、値)は、結果のファイルで見ることができる限り正しく書き込まれますが、SparseVectorまたはVector(org.apache.spark.mllib.linalg.Vector)の記述はありません – Kai

+0

ベクトルを拡張し、独自のプロパティを実装して、jsonにシリアライズおよびデシリアライズできるようにします。 – Tschallacka

答えて

2

答えは簡単です。あなたはスキーマ検出providing schema explicitly is a good ideaためのメカニズムを提供していないソースで作業する場合、正しいスキーマが一般的に

import org.apache.spark.mllib.linalg.VectorUDT 
import org.apache.spark.sql.types.{LongType, StructField, StructType} 

val schema = StructType(Seq(
    StructField("_1", LongType, true), 
    StructField("_2", new VectorUDT, true))) 

spark.read.schema(schema).json(path).printSchema 
root 
|-- _1: long (nullable = true) 
|-- _2: vector (nullable = true) 

spark.read.schema(schema).json(path).show(1) 
// +---+-------------------+ 
// | _1|     _2| 
// +---+-------------------+ 
// | 1|(5,[1,3],[2.0,3.0])| 
// +---+-------------------+ 

を提供するDataFrameReader

import org.apache.spark.mllib.linalg.VectorUDT 

val path: String = ??? 
val df = Seq((1L, Vectors.parse("(5, [1.0, 3.0], [2.0, 3.0])"))).toDF 
df.write.json(path) 

spark.read.json(path).printSchema 
// root 
// |-- _1: long (nullable = true) 
// |-- _2: struct (nullable = true) 
// | |-- indices: array (nullable = true) 
// | | |-- element: long (containsNull = true) 
// | |-- size: long (nullable = true) 
// | |-- type: long (nullable = true) 
// | |-- values: array (nullable = true) 
// | | |-- element: double (containsNull = true) 

のためのスキーマを提供します。

JSONが厳しい要件でない場合、パーケットはベクタータイプを保持し、スキーマの発見メカニズムを提供します。

+0

は答えを感謝します。だから、私はスキーマを提供する必要がある理由は、あなたが送信したリンクに従ってJSONが "スキーマ情報を提供していない"ということです。スキーマを提供する必要のない別のフォーマットがありますか?すなわち、スキーマ情報を保存する形式ですか? – Kai

+0

寄木張りは良い選択です。 – zero323

+1

それはかなりうまくいった:)。再度、感謝します。 – Kai

関連する問題