2017-02-24 4 views
1

の配列として、二つ以上の文字列をマージし、同様に彼らが持っている:私はScalaでデータフレームとしてそれらをロードすることができScalaは私が多くのファイルでJSON文字列のラインがたくさんある1つのJSONプロパティ

{ "id":123, "team":"A", "etc":"...", ...} 
{ "id":124, "team":"A", "etc":"...", ...} 
{ "id":124, "team":"B", "etc":"...", ...} 
{ "id":125, "team":"A", "etc":"...", ...} 

IDでグループ化することで、私は次のように取得したい:私はこれを行うことができますどのように、Scalaで

{ "id":123, "team":"A", "etc":"...", ...} 
{ "id":124, "team":["A","B"], "etc":"...", ...} 
{ "id":125, "team":"A", "etc":"...", ...} 

注:各jsonにいくつのサブプロパティがあるのか​​わかりません。ほとんどのプロパティはjsonのラインで共通です。しかし、いくつかのjsonの行でいくつかの固有のプロパティを持つことは可能です。

+0

は、あなたは、Apache-スパークでこれをやりたいですか? –

+0

はい! apache-spark。 – Daebarkee

答えて

2

私が正しく理解していれば、IDでグループ化し、個々の列をリストとして収集したいですか?

は、列の動的なリストを使用するようにを更新:

df: org.apache.spark.sql.DataFrame = [etc: string, id: bigint ... 1 more field] 

scala> df.show 
+---+---+----+ 
|etc| id|team| 
+---+---+----+ 
| X|123| A| 
| Y|124| A| 
| Z|124| B| 
| X|125| A| 
+---+---+----+ 

val grpCol = "id" 
val collectCols = (df.columns.toSet - grpCol).map(c => collect_list(c).as(c)).toSeq 

df.groupBy('id).agg(collectCols.head, collectCols.tail: _*).show 

+---+------+------+ 
| id| etc| team| 
+---+------+------+ 
|124|[Y, Z]|[A, B]| 
|123| [X]| [A]| 
|125| [X]| [A]| 
+---+------+------+ 
+0

ありがとうございます。しかし、まだもう一つの問題です。私は他の柱がいくつあるのか分かりません。不確定な列数に対してcollect_list()を呼び出すスマートな方法はありますか? – Daebarkee

+0

列の動的リストを使用するように更新されました。 – Traian

+0

ありがとう@PatRox。これは完全に動作します! – Daebarkee

関連する問題