首页 文章

PySpark使用新列表向dataframe添加新列

提问于
浏览
0

根据以前的问题:12 . 假设我有以下数据帧:

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

我想添加新列 x4 但我在Python列表中有 Value 而不是添加到新列中,例如 x4_ls = [35.0, 32.0] . 有没有一种向Spark数据框添加新列的最佳方法? ( note 我使用Spark 2.1)

输出应该是这样的:

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

我也可以将我的列表转换为dataframe df_x4 = spark.createDataFrame([Row(**{'x4': x}) for x in x4_ls]) (但我不知道如何将数据帧连接在一起)

2 回答

  • 0

    感谢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')
    
  • 0

    我们可以在rownumbers的基础上连接如下 . 假设我们有两个数据帧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是您需要的输出数据帧

相关问题