Apache spark 如何选择所有列而不是硬编码每个列?

Apache spark 如何选择所有列而不是硬编码每个列?,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,PySpark数据帧的格式如下: 要仅访问列c1、c2、c3的stddev行,我使用: df.descripe().createOrReplaceTempView(“表1”) df2=sqlContext.sql(“从表1中选择c1作为f1,c2作为f2,c3作为f3”) ddd=df2.rdd.map(lambda x:(float(x.f1)、float(x.f2)、float(x.f3)).zipWithIndex().filter(lambda x:x[1]==2.map(lambda

PySpark
数据帧的格式如下:

要仅访问列c1、c2、c3的
stddev
行,我使用:

df.descripe().createOrReplaceTempView(“表1”)
df2=sqlContext.sql(“从表1中选择c1作为f1,c2作为f2,c3作为f3”)
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])
打印类型(ddd)
打印类型(ddd.collect())
打印ddd.collect()
这张照片是:

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

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

为了在5列中实现这一点,我想使用
“从表1中选择c1作为f1,c2作为f2,c3作为f3,c4作为f4,c5作为f5”
但是有没有更干净的方法来代替在SQL中硬编码每个值,然后在生成rdd时相应地硬编码值:
df2.rdd.map(lambda x:(float(x.f1),float(x.f2)…


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

为什么不直接使用SQL聚合?或者使用
agg

从pyspark.sql.functions导入stddev
df.agg(*[stddev(c)表示df.columns中的c]).first()
其中,
*
用于
agg(*exprs)
的参数解包,或
选择

df.select([stddev(c)表示df.columns中的c]).first()
要删除名称,请将
转换为普通的
元组

元组(df.select(…).first())

df.select(…).rdd.map(tuple).first()

要选择所有列,我决定这样做:

选择(df.columns.show()


由于pyspark可以在其
select
语句中获取一个列表和一个参数,
df.columns
返回
df
所有列的列表,它应该可以完成这项工作。希望它能帮上忙。

使用星号可以快速选择所有列,类似于SQL:

df.select(df['*'])
您还可以在数据帧上调用
别名
,并使用
选择
功能:

df.alias("a").select("a.*")

另一种带星号(*)的方式:


这相当于sql中的
select*from table

这不起作用,TypeError:无效的参数,不是类型的字符串或列。对于列文字,请使用“lit”、“array”、“struct”或“create\u map”函数。
df.select(F.col('*'))