2017-06-01 3 views
1

は、私は、スキーマのようなネストされたエントリが含まれている寄木細工のオブジェクトを持って、次のparquet/spark/scalaで平坦化されたオブジェクト/文字列出力を取得するには?

{"id" : "1201", "name" : "satish", "age" : "25", "path":[{"x":1,"y":1},{"x":2,"y":2}]} 
{"id" : "1202", "name" : "krishna", "age" : "28", "path":[{"x":1.23,"y":2.12},{"x":1.23,"y":2.12}]} 

を、私はそのようなスパーク/スカラ座を使用していることを行うことができますどのように私を出力することができ、すべてがに基づいて、「平坦化」された場合、次のパスエントリ:同様

{"id" : "1201", "name" : "satish", "age" : "25", "x": 1, "y":1} 
{"id" : "1201", "name" : "satish", "age" : "25", "x": 2, "y":2} 
{"id" : "1202", "name" : "krishna", "age" : "28", "x":1,"y":1} 
{"id" : "1202", "name" : "krishna", "age" : "28", "x":2,"y":2} 

+---+----+------+-+--+ 
|age|id |name |x|y | 
+---+----+------+--- + 
|25 |1201|satish|1|1 | 
|25 |1201|satish|1|2 | 
+---+----+------+----+ 

答えて

0

あなたがしなければならないのは、にexplode機能を使用していますあなたのparquetファイルを読んだときにdataframeの列

はあなたparquetファイルから読み込むときに持っていることができますdataframeあなた出力

+---+----+------+-----+ 
|age|id |name |path | 
+---+----+------+-----+ 
|25 |1201|satish|[1,1]| 
|25 |1201|satish|[2,2]| 
+---+----+------+-----+ 

次ていますあなたは

dataframe.withColumn("path", explode($"path")).show(false) 

としてwithColumnexplode機能を組み合わせたら

+---+----+------+--------------+ 
|age|id |name |path   | 
+---+----+------+--------------+ 
|25 |1201|satish|[[1,1], [2,2]]| 
+---+----+------+--------------+ 

としてあなたがSTIならあなただけ selectクエリ

newdf.select("age", "id", "name", "path.x", "path.y").show(false) 

を使用できる2つの別々の列試みる

val newdf = dataframe.withColumn("path", explode($"path")) 
    newdf.withColumn("x", newdf("path.x")) 
     .withColumn("y", newdf("path.x")) 
     .drop("path").show(false) 

かにpath列を区切りにしたいでしょうあなたは

+---+----+------+---+---+ 
|age|id |name |x |y | 
+---+----+------+---+---+ 
|25 |1201|satish|1 |1 | 
|25 |1201|satish|2 |2 | 
+---+----+------+---+---+ 

として、私はこれがあると思い、最終的な結果を持っている必要がありますあなたが探しているもの

+0

あなたは、私がデータフレームオブジェクトへの参照を持っていると仮定し、このための構文の例を示すことができます。出力は

val spark = SparkSession .builder() .master("local") .appName("ParquetAppendMode") .getOrCreate() import spark.implicits._ val data1 = spark.read.json("explode.json") val result = data1.withColumn("path", explode($"path")) result.select("id", "name", "age", "path.x", "path.y").show() 

例の結果を得るために選択しますか?私は前に爆発を使用していない。 – Rolando

+0

@Rolando私は自分の答えを更新しました。希望が助けられる –

+0

閉じる、私はより多くの "フラット"を探しています....(更新OP) – Rolando

1

+----+-------+---+----+----+ 
| id| name|age| x| y| 
+----+-------+---+----+----+ 
|1201| satish| 25| 1.0| 1.0| 
|1201| satish| 25| 2.0| 2.0| 
|1202|krishna| 28|1.23|2.12| 
|1202|krishna| 28|1.23|2.12| 
+----+-------+---+----+----+ 
関連する問題