小编Jos*_*der的帖子

没有 UDF 的 Spark 数据集的加权平均值

虽然有人已经问过在 Spark 中计算加权平均值,但在这个问题中,我问的是使用 Datasets/DataFrames 而不是 RDDs。

如何在 Spark 中计算加权平均值?我有两列:计数和以前的平均值:

case class Stat(name:String, count: Int, average: Double)
val statset = spark.createDataset(Seq(Stat("NY", 1,5.0),
                           Stat("NY",2,1.5),
                           Stat("LA",12,1.0),
                           Stat("LA",15,3.0)))
Run Code Online (Sandbox Code Playgroud)

我希望能够像这样计算加权平均值:

display(statset.groupBy($"name").agg(sum($"count").as("count"),
                    weightedAverage($"count",$"average").as("average")))
Run Code Online (Sandbox Code Playgroud)

可以使用 UDF 来接近:

val weightedAverage = udf(
  (row:Row)=>{
    val counts = row.getAs[WrappedArray[Int]](0)
    val averages = row.getAs[WrappedArray[Double]](1)
    val (count,total) = (counts zip averages).foldLeft((0,0.0)){
      case((cumcount:Int,cumtotal:Double),(newcount:Int,newaverage:Double))=>(cumcount+newcount,cumtotal+newcount*newaverage)}
    (total/count)  // Tested by returning count here and then extracting. Got same result as sum.
  }
)

display(statset.groupBy($"name").agg(sum($"count").as("count"),
                    weightedAverage(struct(collect_list($"count"),
                                    collect_list($"average"))).as("average")))
Run Code Online (Sandbox Code Playgroud)

(感谢将元组列表作为参数传递给 scala 中的 spark udf …

scala apache-spark databricks

2
推荐指数
1
解决办法
3166
查看次数

进程结束,退出代码-1073740791(0xC0000409)pycharm错误

我正在尝试fastText与PyCharm 一起使用。每当我运行以下代码时:

import fastText

model=fastText.train_unsupervised("data_parsed.txt")

model.save_model("model")
Run Code Online (Sandbox Code Playgroud)

该过程退出,并显示以下错误:

Process finished with exit code -1073740791 (0xC0000409)
Run Code Online (Sandbox Code Playgroud)

是什么导致此错误,如何避免该错误?

python pycharm fasttext

2
推荐指数
1
解决办法
6163
查看次数

Numpy逐元素乘法(意外的整数溢出)

我正在使用 Python 3.7 和 numpy 1.15.2,并且在元素乘法中遇到了我不理解的行为。以下对我来说很直观:

import numpy as np
a = np.array([[30000,4000]])
b = np.array([[70000,8000]])
np.multiply(a,b)
Run Code Online (Sandbox Code Playgroud)

array([[2100000000,32000000]])
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时

a = np.array([[30000,40000]])
b = np.array([[70000,80000]])
np.multiply(a,b)
Run Code Online (Sandbox Code Playgroud)

我得到

array([[ 2100000000, -1094967296]])
Run Code Online (Sandbox Code Playgroud)

我猜结果应该是数组([[ 30000*70000, 40000*80000]])。负数从何而来?我该怎么做才能得到预期的数组?

python numpy elementwise-operations

2
推荐指数
1
解决办法
1388
查看次数

什么命令在Matlab中执行str2double的反转?

Matlab有一个num2str命令:

>> num2str([1 2 30])   
ans =   
    '1   2  30'
Run Code Online (Sandbox Code Playgroud)

还有一个str2double命令:

>> str2double({'1','2','30'}) 
ans =
      1     2    30
Run Code Online (Sandbox Code Playgroud)

是否有命令生成字符数组的单元格数组(在Matlab 2017a之前称为字符串)?

>> desired([1 2 30]) 
ans =
  1×3 cell array
    '1'    '2'    '30'
Run Code Online (Sandbox Code Playgroud)

如果没有命令,一个不使用循环的简短明确的解决方案?

matlab casting

1
推荐指数
1
解决办法
94
查看次数