虽然有人已经问过在 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)
我正在尝试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 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]])。负数从何而来?我该怎么做才能得到预期的数组?
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)
如果没有命令,一个不使用循环的简短明确的解决方案?
python ×2
apache-spark ×1
casting ×1
databricks ×1
fasttext ×1
matlab ×1
numpy ×1
pycharm ×1
scala ×1