Pyspark - 将list / tuple传递给toDF函数

问题描述 投票:5回答:2

我有一个数据框,并希望通过传递列表中的列名称使用toDF重命名它,这里列列表是动态的,当我这样做得到错误,我怎么能实现这一点?

>>> df.printSchema()
root
 |-- id: long (nullable = true)
 |-- name: string (nullable = true)
 |-- dept: string (nullable = true)

columns = ['NAME_FIRST', 'DEPT_NAME']

df2 = df.toDF('ID', 'NAME_FIRST', 'DEPT_NAME')
(or) 
df2 = df.toDF('id', columns[0], columns[1])

这个,如果我们不知道输入数据框中有多少列就行不通,所以想要将列表传递给df2,我试过如下

df2 = df.toDF('id', columns)
pyspark.sql.utils.IllegalArgumentException: u"requirement failed: The number of columns doesn't match.\nOld column names (3): id, name, dept\nNew column names (2): id, name_first, dept_name"

在这里它将列表视为单个项目,如何从列表中传递列?

pyspark spark-dataframe
2个回答
16
投票

df2 = df.toDF(列)不起作用,添加*如下 -

columns = ['NAME_FIRST', 'DEPT_NAME']

df2 = df.toDF(*columns)

“*”是“splat”运算符:它将一个列表作为输入,并将其扩展为函数调用中的实际位置参数


-1
投票

您尝试的是正确的,除非您没有将所有列添加到“columns”数组。

这将有效:

columns = ['ID','NAME_FIRST', 'DEPT_NAME']
df2 = df.toDF(columns)

使用我在pyspark中执行的所有步骤更新答案:

list=[(1,'a','b'),(2,'c','d'),(3,'e','f')]
df = sc.parallelize(list)
columns = ['ID','NAME_FIRST', 'DEPT_NAME']
df2 = df.toDF(columns)
© www.soinside.com 2019 - 2024. All rights reserved.