2017-02-22 55 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() 
相關問題