Apache spark 如何在pyspark中找到每列的平均长度?

Apache spark 如何在pyspark中找到每列的平均长度?,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,我创建了如下数据框: from pyspark.sql import Row l = [('Ankit','25','Ankit','Ankit'),('Jalfaizy','2.2','Jalfaizy',"aa"),('saurabh','230','saurabh',"bb"),('Bala','26',"aa","bb")] rdd = sc.parallelize(l) people = rdd.map(lambda x: Row(name=x[0], ages=x[1],lname=

我创建了如下数据框:

from pyspark.sql import Row
l = [('Ankit','25','Ankit','Ankit'),('Jalfaizy','2.2','Jalfaizy',"aa"),('saurabh','230','saurabh',"bb"),('Bala','26',"aa","bb")]
rdd = sc.parallelize(l)
people = rdd.map(lambda x: Row(name=x[0], ages=x[1],lname=x[2],mname=x[3]))
schemaPeople = sqlContext.createDataFrame(people)
schemaPeople.show()

+----+--------+-----+--------+
|ages|   lname|mname|    name|
+----+--------+-----+--------+
|  25|   Ankit|Ankit|   Ankit|
| 2.2|Jalfaizy|   aa|Jalfaizy|
| 230| saurabh|   bb| saurabh|
|  26|      aa|   bb|    Bala|
+----+--------+-----+--------+
我想找到所有COMUN的每一列平均长度,即低于我的预期输出,即特定列中的字符总数/行数

+----+--------+-----+--------+
|ages|   lname|mname|    name|
+----+--------+-----+--------+
|2.5 | 5.5    | 2.75 |  6    |
+----+--------+-----+--------+

我认为您可以为各个长度创建新行,然后对数据帧进行分组。然后你会得到这样的结果:

df_new=spark.createDataFrame[ 25,安基特,安基特,安基特,2.2,杰法兹,aa,杰法兹, 230,索拉布,bb,索拉布,26,aa,bb,巴拉 ],年龄,lname,MNName,姓名 df_new.带ColumnLen_age,lengthcolage.带ColumnLen_lname,lengthcollname\ .带ColumnLen\u mname,lengthcolmname.带ColumnLen\u name,lengthcolname\ .groupBy.aggavglen_age,avglen_lname,avglen_mname,avglen_name.show 结果:

+------------+--------------+--------------+-------------+
|avg(len_age)|avg(len_lname)|avg(len_mname)|avg(len_name)|
+------------+--------------+--------------+-------------+
|         2.5|           5.5|          2.75|          6.0|
+------------+--------------+--------------+-------------+

我认为您可以为各个长度创建新行,然后对数据帧进行分组。然后你会得到这样的结果:

df_new=spark.createDataFrame[ 25,安基特,安基特,安基特,2.2,杰法兹,aa,杰法兹, 230,索拉布,bb,索拉布,26,aa,bb,巴拉 ],年龄,lname,MNName,姓名 df_new.带ColumnLen_age,lengthcolage.带ColumnLen_lname,lengthcollname\ .带ColumnLen\u mname,lengthcolmname.带ColumnLen\u name,lengthcolname\ .groupBy.aggavglen_age,avglen_lname,avglen_mname,avglen_name.show 结果:

+------------+--------------+--------------+-------------+
|avg(len_age)|avg(len_lname)|avg(len_mname)|avg(len_name)|
+------------+--------------+--------------+-------------+
|         2.5|           5.5|          2.75|          6.0|
+------------+--------------+--------------+-------------+

这其实很直截了当。我们将使用列长度投影和平均值聚合:

从pyspark.sql.functions导入长度、列、平均值 选择=['lname','MNName','name'] 阴谋家\ .在选择中为c选择*lengthcolc.aliasc\ .agg*avgcolc.aliasc用于selection.show中的c +---+---+--+ | lname | mname | name|  +---+---+--+ | 5.5| 2.75| 6.0| +---+---+--+ 这样,您就可以动态地传递列的名称。 我们在这里所做的实际上是解包参数列表选择


参考资料:。

这实际上相当直截了当。我们将使用列长度投影和平均值聚合:

从pyspark.sql.functions导入长度、列、平均值 选择=['lname','MNName','name'] 阴谋家\ .在选择中为c选择*lengthcolc.aliasc\ .agg*avgcolc.aliasc用于selection.show中的c +---+---+--+ | lname | mname | name|  +---+---+--+ | 5.5| 2.75| 6.0| +---+---+--+ 这样,您就可以动态地传递列的名称。 我们在这里所做的实际上是解包参数列表选择


参考:.

在Scala中可以这样做,guess,可以由作者转换为Python:

val averageColumnList = List("age", "lname", "mname", "name")
val columns = averageColumnList.map(name => avg(length(col(name))))
val result = df.select(columns: _*)

在Scala中,可以通过这种方式完成guess,作者可以将其转换为Python:

val averageColumnList = List("age", "lname", "mname", "name")
val columns = averageColumnList.map(name => avg(length(col(name))))
val result = df.select(columns: _*)

您好,谢谢您的快速回复,请建议动态传递列名,在我的原始问题中,我有这么多列…这里我只提到了一些列…如果可能,请用UDF解释。您好,谢谢您的快速回复,请建议动态传递列名,在我最初的问题中,我有很多专栏……这里我只提到了一些专栏……如果可能的话,请用UDF解释。谢谢@paultt的编辑谢谢@paultt的编辑