我有一个数据框,并希望通过从列表中传递列名来使用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"
这里它将列表视为单个项目,如何从列表中传递列?
答案 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)