如何在Pyspark中将列作为逗号分隔的参数传递

时间:2018-02-08 11:02:47

标签: python apache-spark pyspark pyspark-sql

我有一个包含数千列的数据框,我希望将其传递给greatest函数,而无需单独指定列名。我怎么能这样做?

例如,我有{3}列df,我将传递给greatest,每个列都指定df.x, df.y..,依此类推。

df = sqlContext.createDataFrame([(1, 4, 3)], ['x', 'y', 'z'])
>>> df.select(greatest(df.x,df.y,df.z).alias('greatest')).show()
+--------+
|greatest|
+--------+
|       4|
+--------+

在上面的示例中,我只有3列,但如果是数千列,则无法提及其中的每一列。我尝试过的几件事并没有奏效。我错过了一些关键的蟒蛇......

df.select(greatest(",".join(df.columns)).alias('greatest')).show()
ValueError: greatest should take at least two columns

df.select(greatest(",".join(df.columns),df[0]).alias('greatest')).show()
u"cannot resolve 'x,y,z' given input columns: [x, y, z];"

df.select(greatest([c for c in df.columns],df[0]).alias('greatest')).show()
Method col([class java.util.ArrayList]) does not exist

1 个答案:

答案 0 :(得分:1)

after supports位置参数*

  

greatest

(这就是为什么你可以pyspark.sql.functions.greatest(*cols))所以只是

greatest(df.x,df.y,df.z)

*引用Python glossary,位置参数为

  
      
  • ...不是关键字参数的参数。位置参数可以出现在参数列表的开头和/或作为以*开头的可迭代元素传递。例如,3和5都是以下调用中的位置参数:

    df = sqlContext.createDataFrame([(1, 4, 3)], ['x', 'y', 'z'])
    df.select(greatest(*df.columns))
    
  •   

此外: