2017-02-22 29 views
0

一个PySpark Dataframe是以下格式:如何选择所有列而不是每个硬编码?

enter image description here

要刚刚访问stddev行的列C1,C2,C3我使用的:

df.describe().createOrReplaceTempView("table1") 

df2 = sqlContext.sql("SELECT c1 AS f1, c2 as f2, c3 as f3 from table1") 
ddd = df2.rdd.map(lambda x : (float(x.f1) , float(x.f2) , float(x.f3))).zipWithIndex().filter(lambda x: x[1] == 2).map(lambda x : x[0]) 
print type(ddd) 
print type(ddd.collect()) 
print ddd.collect() 

此打印:

<class 'pyspark.rdd.PipelinedRDD'> 
<type 'list'> 
[(0.7071067811865476, 0.7071067811865476, 0.7071067811865476)] 

如何为所有列选择stddev值:c1,c2,c3,c 4,c5并为这些选择生成数据类型[(0.7071067811865476, 0.7071067811865476, 0.7071067811865476....,而不是将每个值硬编码到SQL字符串中?所以列数可以是可变的:5,10列等...

要完成这5列,我认为使用"SELECT c1 AS f1, c2 as f2, c3 as f3, c4 as f4, c5 as f5 from table1",但是有一个更清洁的方法,而不是硬编码SQL中的每个值,然后相应硬编码生成rdd时的值:df2.rdd.map(lambda x : (float(x.f1) , float(x.f2).....

由于我的解决方案不适用于长度不同的列。

回答

3

为什么不直接使用SQL聚合?无论是与agg

from pyspark.sql.functions import stddev 

df.agg(*[stddev(c) for c in df.columns]).first() 

其中*用于参数拆包agg(*exprs),或select

df.select([stddev(c) for c in df.columns]).first() 

要删除名称转换为纯tuple

tuple(df.select(...).first()) 

df.select(...).rdd.map(tuple).first() 
相关问题