Apache spark 如何选择所有列而不是硬编码每个列?
PySparkApache 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
数据帧的格式如下:
要仅访问列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('*'))