blu*_*sky 2 apache-spark apache-spark-sql pyspark
PySpark Dataframe采用以下格式:
要只访问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()
Run Code Online (Sandbox Code Playgroud)
这打印:
<class 'pyspark.rdd.PipelinedRDD'>
<type 'list'>
[(0.7071067811865476, 0.7071067811865476, 0.7071067811865476)]
Run Code Online (Sandbox Code Playgroud)
如何stddev为所有列选择值:c1,c2,c3,c4,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).....
由于我的解决方案不适用于不同长度的列.
小智 15
可以使用星号快速选择所有列,类似于 SQL:
df.select(df['*'])
Run Code Online (Sandbox Code Playgroud)
alias您还可以在数据帧上调用并使用该select函数:
df.alias("a").select("a.*")
Run Code Online (Sandbox Code Playgroud)
为什么不直接使用SQL聚合?要么agg
from pyspark.sql.functions import stddev
df.agg(*[stddev(c) for c in df.columns]).first()
Run Code Online (Sandbox Code Playgroud)
where *用于参数解包agg(*exprs),或者select:
df.select([stddev(c) for c in df.columns]).first()
Run Code Online (Sandbox Code Playgroud)
要删除名称转换Row为plain tuple:
tuple(df.select(...).first())
Run Code Online (Sandbox Code Playgroud)
要么
df.select(...).rdd.map(tuple).first()
Run Code Online (Sandbox Code Playgroud)
要选择所有列,我决定这样做:
df.select(df.columns).show()。
select由于 pyspark 可以在其语句中接受一个列表和一个参数,df.columns它返回 的所有列的列表df,它应该完成这项工作。希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
6069 次 |
| 最近记录: |