2017-02-15 16 views
0

前の質問に基づく:12。代わりに、例えば新しい列に追加するPySpark新しい列をデータフレームに追加する

df = spark.createDataFrame(
    [(1, "a", 23.0), (3, "B", -23.0)], 
    ("x1", "x2", "x3")) 

そして私は新しい列x4を追加したいが、私は、Pythonのリストの値を持っている:私は、次のデータフレームを持っていると仮定x4_ls = [35.0, 32.0]。 Sparkデータフレームに新しい列を追加する最善の方法はありますか?私はまた、データフレームdf_x4 = spark.createDataFrame([Row(**{'x4': x}) for x in x4_ls])に私のリストを変換することができ

## +---+---+-----+----+ 
## | x1| x2| x3| x4| 
## +---+---+-----+----+ 
## | 1| a| 23.0|35.0| 
## | 3| B|-23.0|32.0| 
## +---+---+-----+----+ 

(しかし、私はどのように一緒にデータフレームを連結していない)

:(私はスパーク2.1を使用 ノート

出力は次のようなものでなければなりません

答えて

0

ありがとう:我々は2つのデータフレームDFとdf_x4があるとします!私は彼の解決策を少し変更しました。追加された新しい列row_numに2つのデータフレームを結合する私のソリューションはここにあります。

from pyspark.sql import Row 

def flatten_row(r): 
    r_ = r.features.asDict() 
    r_.update({'row_num': r.row_num}) 
    return Row(**r_) 

def add_row_num(df): 
    df_row_num = df.rdd.zipWithIndex().toDF(['features', 'row_num']) 
    df_out = df_row_num.rdd.map(lambda x : flatten_row(x)).toDF() 
    return df_out 

df = add_row_num(df) 
df_x4 = add_row_num(df_x4) 
df_concat = df.join(df_x4, on='row_num').drop('row_num') 
+0

データフレームを連結したり、値をデータフレームに追加したりする簡単な方法がないようです。 – titipata

0

次のようにしてrownumbersに基づいて連結することができます。偉大な答えのためのGaurav Dhamaへ

def addrownum(df): 
    dff = df.rdd.zipWithIndex().toDF(['features','rownum']) 
    odf = dff.map(lambda x : tuple(x.features)+tuple([x.rownum])).toDF(df.columns+['rownum']) 
    return odf 

df1 = addrownum(df) 
df2 = addrownum(df_x4) 

outputdf = df1.join(df2,df1.rownum==df2.rownum).drop(df1.rownum).drop(df2.rownum) 

## outputdf 
## +---+---+-----+----+ 
## | x1| x2| x3| x4| 
## +---+---+-----+----+ 
## | 1| a| 23.0|35.0| 
## | 3| B|-23.0|32.0| 
## +---+---+-----+----+ 

outputdfがあるあなたに必要な出力データフレーム

関連する問題