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

时间:2017-05-02 21:43:55

标签: pyspark spark-dataframe

我有一个数据框,并希望通过从列表中传递列名来使用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"

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

2 个答案:

答案 0 :(得分:13)

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

columns = ['NAME_FIRST', 'DEPT_NAME']

df2 = df.toDF(*columns)
  

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

答案 1 :(得分:-1)

您尝试的是正确的,除非您没有将所有列添加到"列"阵列。

这将有效:

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)