Apache spark 每行计算并在DataFrame PySpark中添加新列-更好的解决方案?

Apache spark 每行计算并在DataFrame PySpark中添加新列-更好的解决方案?,apache-spark,dataframe,pyspark,apache-spark-sql,rdd,Apache Spark,Dataframe,Pyspark,Apache Spark Sql,Rdd,我在PySpark中使用数据帧 我有以下任务:检查所有列中每个列的“次数”值大于2的次数。对于u1,它是0,对于u2=>2,依此类推 user a b c d times u1 1 0 1 0 0 u2 0 1 4 3 2 u3 2 1 7 0 1 我的解决方案如下。这是可行的,我不确定这是不是最好的方法,也没有尝试真正的大数据。我不喜欢转换为rdd并返回到数据帧。还有更好的吗?我在开始时认为每

我在PySpark中使用数据帧 我有以下任务:检查所有列中每个列的“次数”值大于2的次数。对于u1,它是0,对于u2=>2,依此类推

user    a   b   c   d   times
   u1   1   0   1   0   0
   u2   0   1   4   3   2
   u3   2   1   7   0   1
我的解决方案如下。这是可行的,我不确定这是不是最好的方法,也没有尝试真正的大数据。我不喜欢转换为rdd并返回到数据帧。还有更好的吗?我在开始时认为每列按UDF计算,但没有找到一种方法来计算每行的所有结果:

def计算时间(行):
次数=0
对于索引,枚举(行)中的项:
如果不是isinstance(项,基串):
如果项目>2:
次数=次数+1
返回时间
def add_列(成对):
返回dict(对[0]。asDict().items()+[(“是异常值”,对[1]))
def计算所有(df)的时间:
rdd_与_时间=df.map(lambda行:(计算_时间(行))
rdd_final=df.rdd.zip(rdd_与_时间).map(添加_列)
df_final=sqlContext.createDataFrame(rdd_final)
返回df_最终版本
对于这个解决方案,我使用了这个主题


谢谢!

这只是一个简单的单行程序。示例数据:

df=sc.parallelize([
(u1,1,0,1,0),(u2,0,1,4,3),(u3,2,1,7,0)
]).toDF([“用户”、“a”、“b”、“c”、“d”])
带列

df.withColumn(“times”,sum((df[c]>2.cast(“int”)表示df.columns[1:]))
结果是:

+----+---+---+---+---+-----+
|用户| a | b | c | d |次|
+----+---+---+---+---+-----+
|u1 | 1 | 0 | 1 | 0 | 0|
|u2 | 0 | 1 | 4 | 3 | 2|
|u3 | 2 | 1 | 7 | 0 | 1|
+----+---+---+---+---+-----+
注:

It列可为
您应该对此进行更正,例如使用
合并

来自pyspark.sql.functions的
导入合并
df.columns[1:]中c的和(合并((df[c]>2.cast(“int”),0)