spark 的 approxQuantile 问题,无法识别 List<String>

Posted

技术标签:

【中文标题】spark 的 approxQuantile 问题,无法识别 List<String>【英文标题】:Issue with approxQuantile of spark , not recognizing List<String> 【发布时间】:2020-03-05 16:38:23 【问题描述】:

我在 java8 项目中使用 spark-sql-2.4.1v。

我需要计算以下给定数据框df 的某些(计算的)列(即con_dist_1con_dist_2)上的分位数:

+----+---------+-------------+----------+-----------+
|  id|     date|   revenue   |con_dist_1| con_dist_2|
+----+---------+-------------+----------+-----------+
|  10|1/15/2018|  0.010680705|         6|0.019875458|
|  10|1/15/2018|  0.006628853|         4|0.816039063|
|  10|1/15/2018|   0.01378215|         4|0.082049528|
|  10|1/15/2018|  0.010680705|         6|0.019875458|
|  10|1/15/2018|  0.006628853|         4|0.816039063|
|  10|1/15/2018|   0.01378215|         4|0.082049528|
|  10|1/15/2018|  0.010680705|         6|0.019875458|
|  10|1/15/2018|  0.010680705|         6|0.019875458|
|  10|1/15/2018|  0.014933087|         5|0.034681906|
|  10|1/15/2018|  0.014448282|         3|0.082049528|
+----+---------+-------------+----------+-----------+

List<String> calcColmns = Arrays.asList("con_dist_1","con_dist_2")

当我尝试使用approxQuantile 的第一个版本时,即approxQuantile(List&lt;String&gt;, List&lt;Double&gt;, double) 如下

List<List<Double>> quants = df.stat().approxQuantile(calcColmns , Array(0.0,0.1,0.5),0.0);

报错:

类型中的方法approxQuantile(String, double[], double) DataFrameStatFunctions 不适用于参数 (列表、列表、双精度)

这里有什么问题?我在我的eclipseIDE中做这件事。为什么即使我传递了List&lt;String&gt;,它也不调用List&lt;String&gt;

添加了 API 快照:

【问题讨论】:

您在哪里看到 approxQuantile 的定义,它需要两个列表和一个双精度数?我看到的 API 文档讨论了 String、double[] 和 double(这是错误消息所说的)。 @StephenDarlington: approxQuantile 在 Spark 2.2.0 中添加了多个列。 很久没用过Java了,会不会是Array(0.0,0.1,0.5)的问题?尝试将列表声明为double[] percentiles = 0.0,0.1,0.5; 看看它是否有效。 @Shaido-ReinstateMonica 您应该将其添加为答案——几乎可以肯定是这样。 @BdEngineer:我在这里添加了一个答案,几个小时后会有一些时间来看看这个新问题。 【参考方案1】:

看起来这可能是由于在 approxQuantile 函数的输入中使用了 Array。最简单的解决方法是对列和百分位数都使用数组(这将使用 API 快照中的第三个 approxQuantile 方法。:

String[] calcColmns = "con_dist_1", "con_dist_2";
double[] percentiles = 0.0,0.1,0.5;

然后调用函数:

double[][] quants = df.stat().approxQuantile(calcColmns, percentiles, 0.0);

【讨论】:

以上是关于spark 的 approxQuantile 问题,无法识别 List<String>的主要内容,如果未能解决你的问题,请参考以下文章

使用 SparkR 分组百分位数

以动态方式找到Spark-Scala中的百分位数

遇到的问题---spark---spark OutOfMemoryError: Java heap space

遇到的问题---spark---spark OutOfMemoryError: Java heap space

Spark调优 | Spark OOM问题常见解决方式

关于 Spark 问题的 HIVE