PySpark将新列添加到数据框与新列表
问题描述:
根据以前的问题:1,2。假设我有以下数据框:PySpark将新列添加到数据框与新列表
df = spark.createDataFrame(
[(1, "a", 23.0), (3, "B", -23.0)],
("x1", "x2", "x3"))
我要添加新列x4
,但我有在Python列表值,而不是添加到新列如x4_ls = [35.0, 32.0]
。有没有一种最佳方式将新列添加到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])
(但我不是如何连接在一起的数据帧)
答
感谢拉夫居所为一个伟大的答案!我对他的解决方案做了一些改变。这是我的解决方案,它将两个数据帧连接在一起,添加新列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')
答
我们可以在rownumbers的基础上连接如下。假设我们有两个dataframes 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是你需要的输出数据帧
好像现在没有简单的方法来连接数据框或将值添加到数据框。 – titipata