取消
顯示的結果
而不是尋找
你的意思是:

訪問結構體元素dataframe裏麵?

schnee1
新的貢獻者三世

我有JSON數據集包含一個價格在一個字符串“5.00美元”。我想將數字部分轉換成雙使用在一個MLLIB LabeledPoint,並設法把價格字符串分割成一個字符串數組。下麵創建一個數據集與正確的結構:

- - - - - - - - - - - - - - -

進口org.apache.spark.mllib.linalg。{向量,向量}

進口org.apache.spark.mllib.regression.LabeledPoint

case類突發交換(f1:雙,f2:雙,價格:數組(String))

val obs1 = newObs(1、2、數組(“美元”,“5.00”)

val obs2 = newObs(2, 1,數組(“美元”,“3.00”)

val df = sc.parallelize (Seq (obs1 obs2)) .toDF ()

df。printSchema df.show ()

val = df的標簽。地圖(行= > LabeledPoint (row.get (2) .asInstanceOf [Array [String]]蘋果(1).toDouble, Vectors.dense (row.getDouble (0) row.getDouble (1))))

labeled.take (2) .foreach println ()

- - - - - - - - - - - - - - - - - - - - -

當我運行這個的時候,我得到這個(以及更多):

df: org.apache.spark.sql。DataFrame = [f1:雙,f2:雙,價格:數組<字符串>)

“價格”是一個字符串數組。

我也得到一個類轉換異常

. lang。scala.collection.mutable ClassCastException。WrappedArray ofRef美元不能投[Ljava.lang.String;

這可能是對“println”,但也可能意味著我沒有得到‘價格’的第二元素結構。

幫助嗎?

8回答說8

schnee1
新的貢獻者三世

我最終得到過去的時候可以這樣說:

val彙編= new VectorAssembler () .setInputCols(數組(f1, f2”)) .setOutputCol(“特性”)

val標簽= assembler.transform (df) .select(“價格”.getItem美元(1).cast(“雙”),美元“特性”). map{情況行(價格:雙,特點:向量)= > LabeledPoint(價格、功能)}

似乎更詳細(h / t stackoverflow)和直接“促進”結構的元素,我需要他們的地方。

我也最終通過異常(是這個比賽例外)。

謝謝你的傾身。

schnee1
新的貢獻者三世

更詳細一些,這樣的工作:

val dfExploded = df.explode (df(“價格”)){病例行(公關:WrappedArray [String]) = > pr.map (pr = >價格(pr (0)。toString,公關(1).toString)}

dfExploded.show ()

(我不得不使用“WrappedArray”而不是“數組”的例外)

但輸出有問題(char限製在本論壇迫使簡潔)

時代
新的貢獻者二世

@schnee

很明顯的例外row.get WrappedArray對象的(2)。這是因為ArrayType數組數據類型。ArrayType所有對象被存儲為WrappedArray(任何)。獲取價格,做row.get (2) .asInstanceOf [Array [String]]。

goldentriangle
新的貢獻者二世
歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map