簡體   English   中英

PySpark使用新列表將新列添加到數據框

[英]PySpark add new column to dataframe with new list

基於前面的問題: 12 假設我有以下數據框:

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

而且我想添加新列x4但是我在Python列表中有值,而不是添加到新列,例如x4_ls = [35.0, 32.0] 是否有最佳方法將新列添加到Spark數據框? 請注意 ,我使用Spark 2.1)

輸出應該是這樣的:

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

我還可以將列表轉換為數據幀df_x4 = spark.createDataFrame([Row(**{'x4': x}) for x in x4_ls]) (但我不知道如何將數據幀連接在一起)

我們可以根據行號進行如下連接。 假設我們有兩個數據幀df和df_x4:

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是您所需的輸出數據幀

感謝Gaurav Dhama的出色回答! 我對他的解決方案做了一些修改。 這是我的解決方案,在添加的新列row_num上將兩個數據框連接在一起。

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM