2017-09-06 23 views
0

我有一個包含在下面火花 - 分裂,轉換和存儲矢量數據轉換爲CSV文件

+--------------------+-----+-----------+ 
|   features|Label|OutputLabel| 
+--------------------+-----+-----------+ 
|(1133,[33,296,107...| 0|  0.0| 
|(1133,[19,1045,10...| 0|  0.0| 
|(1133,[9,398,1075...| 0|  0.0| 
|(1133,[0,927,1074...| 0|  0.0| 
|(1133,[41,223,107...| 0|  0.0| 
|(1133,[70,285,108...| 0|  0.0| 
|(1133,[4,212,1074...| 0|  0.0| 
|(1133,[25,261,107...| 0|  0.0| 
|(1133,[0,258,1074...| 0|  0.0| 
|(1133,[2,219,1074...| 0|  0.0| 
|(1133,[8,720,1074...| 0|  0.0| 
|(1133,[2,260,1074...| 0|  0.0| 
|(1133,[54,348,107...| 0|  0.0| 
|(1133,[167,859,10...| 0|  0.0| 
|(1133,[1,291,1074...| 0|  0.0| 
|(1133,[1,211,1074...| 0|  0.0| 
|(1133,[23,216,107...| 0|  0.0| 
|(1133,[126,209,11...| 0|  0.0| 
|(1133,[70,285,108...| 0|  0.0| 
|(1133,[96,417,107...| 0|  0.0| 
+--------------------+-----+-----------+ 
所示它的列狀的第一列中的一個矢量數據的火花數據幀

更新:請參閱模式下面此數據幀的

root 
|-- features: vector (nullable = true) 
|-- Label: integer (nullable = true) 
|-- OutputLabel: double (nullable = true) 

問題1:我需要的第一列的數據拆分爲兩列,以使整數數據應該來在一列與陣列數據應進來另一列。不知道如何在Spark/Scala中做到這一點?任何指針都會有幫助。

當我試圖寫這個數據幀以csv文件,我得到了下面的錯誤

異常線程「main」 java.lang.UnsupportedOperationException: CSV數據源不支持 結構,價值觀:array> 數據類型。

問題2:我知道,即使這個數據幀不能寫成文本文件,因爲它會只寫一列到輸出文件,它不應該是結構類型的。那麼是否可以在將第一列分成兩個單獨的列之後編寫此數據框?第二列數據將是數組數據類型。我們可以用這種方式寫入輸出文件嗎?

問題3:我們有可能將數組數據單獨寫入csv文件嗎?

+0

你可以分享你的數據框的模式說明? –

+0

@RameshMaharjan我已經更新了這個問題以獲得模式。請檢查一下 – JKC

回答

0

那麼是否有可能在將第一列分成兩個單獨的列後寫入這個數據幀?

不,您所看到的僅僅是SparseVector的表示形式。即使您提取索引和值,CSV源只支持原子類型。

如果你死心塌地在使用CSV我一整列轉換爲JSON

import org.apache.spark.ml.linalg.Vectors 
import org.apache.spark.sql.functions._ 

val df = sc.parallelize(Seq(
    (Vectors.sparse(100, Array(1, 11, 42), Array(1, 2, 3)), 0, 0.0) 
)).toDF("features", "label", "outputlabel") 

df.withColumn("features", to_json(struct($"features"))).write.csv(...) 

解析它以Vector遵循provided here