2017-12-18 8 views
0

CSVに3列、itemusername、およびuseridがあるとします。その後dsはタイプDataset[Flat]のものであろうSparkはネストされたケースクラスに直接データを読み込むことができますか?

case class Flat(item: String, username: String, userid: String) 
ds = sparkSession.read.csv("path/to/data").toDF("item", "username", "userid").as[Flat] 

:でこれを読むためにスパークのデータセットのAPIを使用するために、かなり単純な問題です。

しかし、あなたはあなたのデータはNestedは次式で与えられ、フォームDataset[Nested]持っていることを好むだろうと仮定します。それを行うための1つの方法はDataset[Flat]にデータを読み込み、それを変換するためにmapを適用することです

case class User(name: String, id: String) 
case class Nested(item: String, user: User) 

を実際にはFlatケースクラスは他には必要ではないことが多く、コードを不必要に冗長にしてしまいます。仲介者をスキップして直接Dataset[Nested]を構築する方法はありますか?

+0

sqlContextの代わりにsparkContextを使用して読み込んだ後、前述のようにマップを使用してネストされたケースクラスに変換しましたか? –

答えて

1

仲介者をスキップして[ネストされた]データセットを直接作成する方法はありますか?

- Datasetsは構造と名前が一致していません。あなたは名前だけを持つことができず、データを再形成する必要があります。

あなたはちょうどあなたが緩んで何もしないように

import org.apache.spark.sql.functions._ 

ds.select($"item", struct($"name", $"id") as "user").as[Nested] 

as[Flat]が本当にチェックを入力していない動的なAPIを使用Flat定義をスキップすることを好む場合。

+0

これは素晴らしい解決策です - ありがとう! –

関連する問題