2016-07-05 8 views
0

内の行を超えるとなると、データの必要な変換を生成するための簡単なdataframe.mapを持っている必要があります。しかし、私は変更された元のデータで追加の行を提供する必要があります。私はdataframe.mapを使ってこれをどのように使うことができますか?Dataframe.mapは、私はスカラ座や火花を使用していたデータセット

例:から データセット:

  • ID、氏名、年齢
  • 1、ジョン、23
  • 2、ピーター、32

年齢< 25デフォルトの場合は25に。

データセット:

  • ID、氏名、年齢
  • 1、ジョン、25
  • 1は、ジョン、-23
  • 2、ピーターは、32

答えて

0

'UnionAllは、' それを扱いますか?

例えば、

df1 = original dataframe 
    df2 = transformed df1 

    df1.unionAll(df2) 

EDIT:unionAllを使用して実装()

val df1=sqlContext.createDataFrame(Seq( (1,"john",23) , (2,"peter",32))). 
      toDF("id","name","age") 

def udfTransform= udf[Int,Int] { (age) => if (age<25) 25 else age } 

val df2=df1.withColumn("age2", udfTransform($"age")). 
      where("age!=age2"). 
      drop("age2") 

df1.withColumn("age", udfTransform($"age")). 
    unionAll(df2). 
    orderBy("id"). 
    show() 

+---+-----+---+ 
| id| name|age| 
+---+-----+---+ 
| 1| john| 25| 
| 1| john| 23| 
| 2|peter| 32| 
+---+-----+---+ 

注:実装は元々提案(ナイーブ)溶液から少し異なります。悪魔は常に細部にいます!

EDIT 2:実装ネストされた配列を使用して

val df1=sx.createDataFrame(Seq( (1,"john",23) , (2,"peter",32))). 
      toDF("id","name","age") 
def udfArr= udf[Array[Int],Int] { (age) => 
       if (age<25) Array(age,25) else Array(age) } 

val df2=df1.withColumn("age", udfArr($"age")) 

df2.show() 
+---+-----+--------+ 
| id| name|  age| 
+---+-----+--------+ 
| 1| john|[23, 25]| 
| 2|peter| [32]| 
+---+-----+--------+ 


df2.withColumn("age",explode($"age")).show() 
+---+-----+---+ 
| id| name|age| 
+---+-----+---+ 
| 1| john| 23| 
| 1| john| 25| 
| 2|peter| 32| 
+---+-----+---+ 
+1

を爆発私はあなたの答えは質問を解決しない方法を求めることができますか? – eliasah

+0

上記の実装1と2を参照してください。 – WillemM

+0

2番目のオプションが私のために働くかもしれないと思われて、それを試して更新します。ありがとう。 – Pacchy

関連する問題