2016-05-12 3 views
0

(配列内の値は文字列です):スパークデータフレームは:新しい列にリストを追加(のpython)私は、次のデータフレームを持っています

+--------------------+--------------------+ 
|    col1|    col2| 
+--------------------+--------------------+ 
| [value1, value2]|  [value3,value4]| 
|   [value5]|   [value6]| 
+--------------------+--------------------+ 

は、どのように私を含む新しい配列を持つ新しい列を作成することができ、すべての両方

+--------------------+--------------------+------------------------------+ 
|    col1|    col2|       new | 
+--------------------+--------------------+------------------------------+ 
| [value1, value2]|  [value3,value4]|[value1, value2,value3,value4]| 
|   [value5]|   [value6]|    [value5,value6]| 
+--------------------+--------------------+------------------------------+ 

の値は、私は次のことを試してみました:

def add_function(col1,col2): 
    return col1+col2 

udf_add = udf(add_function,ArrayType(StringType())) 
dftrial.withColumn("new",udf_add("col1","col2")).show(2) 

必要に応じてタスクを実行しません。

def add_function(col1,col2): 
    return col1.extend(col2) 

それはnull値を返します。しかし、私は私がadd_functionを変更する際に理由を理解しません。どうして?

私の主な質問:このタスクを実装する別の方法はありますか?既に実装されている関数ですか?私はconcatを見つけましたが、それは文字列に対してのみ機能するようです。

答えて

1

なぜでしょうか? Pythonの型ヒントlist.extendを使用すると、次のとおりです。

list.extend(iterable) -> None 

ですから、extendから返された正確に何を得ます。もしあなたが実際にはcol1を返すべきであるコレクションを修正したいと思っているのですが、実際にはここで悪い部分があるからです。

はありません Sparkで作業する場合は、データを修正してください。この特定のシナリオでは安全ですが、予測できない結果を招く可能性があります。私の答えはWill there be any scenario, where Spark RDD's fail to satisfy immutability.?です。 PySparkはこのような振る舞いから比較的隔離されていますが、これは実装の詳細なものであり、一般的に依存できるものではありません。

+0

ご回答ありがとうございます。私は決して何をすべきではないかを明確にすることができますか?私はそれを正確に理解しなかったので、私が紛失しているという重要な情報であるようです。 –

+1

'list.extend'は、既存の' list'を変更(変更)します。あなたのデータでこれをしないでください。明示的に許可されない限り、常に新しいオブジェクトを返します( 'RDD.fold'、' RDD.aggregate'などを参照) – zero323

0

私は@ zero323に同意します。私はちょうど新しいデータフレームのソリューションを得るために必要な変換を追加したかったのです。

val updatedDataframe = initialDataframe.map { 
    case Row(col1: Seq[String], col2: Seq[String]) => (col1, col2, col1.union(col2)) 
    }.toDF("col1", "col2", "col3") 
関連する問題