如何将新列添加到spark数据帧取决于multipme现有列?

时间:2018-04-05 10:22:06

标签: scala apache-spark spark-dataframe

我要向数据框添加新列。例如,我有一个数据帧df

    id|c_1         |c_2          |c_3       |c_4    |.......|c_200    |c_tot
    1 |[1,2,3,5]   |[t,4,bv,55,2]|[]        |[1,22] |       |[k,v,c,x]|[1,2,3,4,5,t,bv,55,22,k,v,c,x]
    2 |[1,2,4]     |[4,3,8]      |[6,7]     |[10,12]        | [11]    |[1,2,3,4,6,7,8,10,11,12]
    .
    .

我希望从我的数据框中获得一些统计信息,例如我想要为每个id包含一个包含Entropy的新列 所以我们必须为每个c_i计算pi,然后计算熵

    pi=(size(c_i)+1))/(size(c_tot)+1)
    Entropy=-sum(pi*ln(pi))   \\i in[1,200]

例如,对于新列熵的第一个值必须是

    entropy=-((5/14*ln(5/14))+(6/14*ln(6/14))+(1/14*ln(1/14)).... +(5/14)*ln(5/14))

我知道我可以使用表达式link但是没有找到表达式的想法,因为我有多列。

1 个答案:

答案 0 :(得分:1)

您的表达可以略微简化为:

Entropy

在Scala中生成:

entropy = (1 to 200).toSeq
                    .map(c => s" ( size(c_$c) + 1 ) * ln( (size(c_$c) + 1) / (size(c_tot) + 1) ) ")
                    .mkString("-(" , "+" , ") / size(c_tot) ")

然后将其与expr

一起使用
df.withColumn("entropy" , expr(entropy) )