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

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)


use*_*411 6

为什么不直接使用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)


Jul*_*bal 5

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

df.select(df.columns).show()。

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

  • 这不起作用,类型错误:参数无效,不是字符串或列:类型为 &lt;class 'list'&gt;。对于列文字,请使用“lit”、“array”、“struct”或“create_map”函数。 (3认同)