2016-07-21 13 views
0

私はjson文字列を持っており、SQLContext.read.json()がファイルからの初期読み込み時にその変換を行う方法と同様に構造体に変換できるようにしたいと考えています。json文字列の列を構造体に変換

また、DataFrameをネストする方法はありますか?私もそうすることができました。

+0

私はまったく異なる方向に行きました。私は、json文字列を列の各行の構造体に変換できる何らかのメソッドが用意されていることを期待していました。 –

答えて

2

スパークは、データフレーム(またはデータセットまたはRDD)のネストをサポートしていません。

問題を2つの別々の手順に分けることができます。

まず、JSONを解析し、完全にタイプがSparkがサポートするケースクラスを作成する必要があります。

def buildMyCaseClass(json: String): MyCaseClass = { ... } 

はその後、あなたは文字列が構造体の列になるように、あなたのデータフレームを変換する必要があります。この問題は、そうあなたがこれをコード化されてきたとしましょうスパークとは何の関係もありません。これを行う最も簡単な方法は、UDF経由です。

val builderUdf = udf(buildMyCaseClass _) 
df.withColumn("myCol", builderUdf('myCol)) 
+1

私はこれが行く方法かもしれないと考えていましたが、最初にデータを暗号化する前に、sqlContext.read.json( "path")をあなたが言ったように、私はちょうど自分のパーサーを作成する代わりに、何らかの方法でスキーマ推論を利用できることを期待していました。 –

+0

JSONスキーマの推論はSparkの勇気に埋もれています。私は設計上の決定に同意しませんが、データを2回通過する(ディスカバリーパスとマージ/ユニオンパス)必要があるため、理解しています。非常に意欲的であれば、独自のクラスをSparkパッケージの名前空間に登録してこの機能にアクセスできますが、私はそれをお勧めしません。 JSONを書くことができ、既存のデータに追加するカラムを追加する限り、自動的にスキーマのディスカバリーを行うことができます。たとえば、 '' {joinKey:...、jsonCol:... } "。遅くても信頼できる。 – Sim

関連する問題