Apache spark 在许多元素上高效地查找中间值或近似中间值

Apache spark 在许多元素上高效地查找中间值或近似中间值,apache-spark,out-of-memory,apache-spark-sql,median,Apache Spark,Out Of Memory,Apache Spark Sql,Median,我正在使用一个健壮的Z-Score方法,使用sparksql在许多列中查找异常。不幸的是,这涉及到计算许多中位数,不幸的是效率非常低。我做了一些搜索,但找不到任何用于近似或快速中值计算的内置高效库 每次运行涉及以下“sqlContext.sql(“SELECT percentile_approx(“+colname+”,0.5)FROM partitioned”)的查询时,我都会收到以下错误: Name: java.lang.OutOfMemoryError Message: GC overhe

我正在使用一个健壮的Z-Score方法,使用sparksql在许多列中查找异常。不幸的是,这涉及到计算许多中位数,不幸的是效率非常低。我做了一些搜索,但找不到任何用于近似或快速中值计算的内置高效库

每次运行涉及以下“sqlContext.sql(“SELECT percentile_approx(“+colname+”,0.5)FROM partitioned”)的查询时,我都会收到以下错误:

Name: java.lang.OutOfMemoryError
Message: GC overhead limit exceeded
所以我假设这个方法在实践中肯定不太实用。
如果有必要,我可以发布部分代码(我没有发布,因为目前代码有点复杂,但如果需要,我可以发布)。我的数据集最多有500k个点,所以你们认为这是一个缓存效率低下的问题吗(),在我这方面的数据使用率,还是我需要一个更好的方法来查找中间值?

如果您想像问题中那样使用Hive UDF,可以提供确定要使用的记录数的附加参数:

import org.apache.spark.mllib.random.RandomRDDs
RandomRDDs.normalRDD(sc,100000).map(Tuple1()).toDF(“x”).registerEmptable(“df”)
sqlContext.sql(“从df中选择百分位_近似值(x,0.5100”).show()
// +--------------------+
//|uC0|
// +--------------------+
// |-0.02626781447291...|
// +--------------------+
sqlContext.sql(“从df中选择百分位_近似值(x,0.5,10)).show()
// +-------------------+
//|uC0|
// +-------------------+
// |-0.4185534605295841|
// +-------------------+
默认值为10000,因此,尽管由于相关的洗牌,它仍然很昂贵,但在实践中不应导致OOM。这表明您的配置或查询可能存在一些超出中值计算本身的其他问题


另一方面,Spark 2.0.0提供了本机百分位数近似方法,如中所述。

如果您想像问题中那样使用Hive UDF,可以提供其他参数,确定要使用的记录数:

import org.apache.spark.mllib.random.RandomRDDs
RandomRDDs.normalRDD(sc,100000).map(Tuple1()).toDF(“x”).registerEmptable(“df”)
sqlContext.sql(“从df中选择百分位_近似值(x,0.5100”).show()
// +--------------------+
//|uC0|
// +--------------------+
// |-0.02626781447291...|
// +--------------------+
sqlContext.sql(“从df中选择百分位_近似值(x,0.5,10)).show()
// +-------------------+
//|uC0|
// +-------------------+
// |-0.4185534605295841|
// +-------------------+
默认值为10000,因此,尽管由于相关的洗牌,它仍然很昂贵,但在实践中不应导致OOM。这表明您的配置或查询可能存在一些超出中值计算本身的其他问题


另一方面,Spark 2.0.0提供了本机百分位数近似方法,如中所述。

为什么不对元素进行排序,并取第2个元素的大小?它速度快得多,速度快得多easier@GameOfThrows有没有一种好方法可以在不需要定义新数据帧的情况下就地实现这一点?目前我对Spark还比较陌生,如果是的话,它从来就不是Spark的一部分。这只是一个恰好与Spark兼容的配置单元代码。为什么不对元素进行排序并取第2个元素的大小?它速度快得多,速度快得多easier@GameOfThrows有没有一种好方法可以在不需要定义新数据帧的情况下就地实现这一点?目前我对Spark还比较陌生,如果是的话,它从来就不是Spark的一部分。这只是一个与Spark兼容的配置单元代码。