Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 按聚合(求和)双精度分组会在spark中产生不一致的结果_Scala_Apache Spark_Pivot_Rounding_Aggregation - Fatal编程技术网

Scala 按聚合(求和)双精度分组会在spark中产生不一致的结果

Scala 按聚合(求和)双精度分组会在spark中产生不一致的结果,scala,apache-spark,pivot,rounding,aggregation,Scala,Apache Spark,Pivot,Rounding,Aggregation,我在Scala和Spark 2.0中看到了一些不一致的行为,即聚合双倍,然后按聚合值分组。这只发生在集群模式下,我相信这与双倍相加的顺序有关,产生一个稍微不同的数字。在最初的攻击之后,我以结果为轴心,并按求和值分组。有时会看到1行,有时会看到2行,其值在小数点后20位左右略有变化。我不能给出一个完整的示例,但这里是REPL中的一个简化/精心设计的版本,它的行为正确,但显示了我正在尝试做的事情: scala> val df = List((1, "a", 27577661.013638947

我在Scala和Spark 2.0中看到了一些不一致的行为,即聚合双倍,然后按聚合值分组。这只发生在集群模式下,我相信这与双倍相加的顺序有关,产生一个稍微不同的数字。在最初的攻击之后,我以结果为轴心,并按求和值分组。有时会看到1行,有时会看到2行,其值在小数点后20位左右略有变化。我不能给出一个完整的示例,但这里是REPL中的一个简化/精心设计的版本,它的行为正确,但显示了我正在尝试做的事情:

scala> val df = List((1, "a", 27577661.013638947), (1, "a", 37577661.013538947)).toDF("a", "b", "c")
df: org.apache.spark.sql.DataFrame = [a: int, b: string ... 1 more field]

scala> df.show
+---+---+--------------------+
|  a|  b|                   c|
+---+---+--------------------+
|  1|  a|2.7577661013638947E7|
|  1|  a| 3.757766101353895E7|
+---+---+--------------------+

scala> val grouped = df.groupBy("a", "b").agg(sum("c").as("c"))
grouped: org.apache.spark.sql.DataFrame = [a: int, b: string ... 1 more field]

scala> grouped.show
+---+---+------------------+
|  a|  b|                 c|
+---+---+------------------+
|  1|  a|6.51553220271779E7|
+---+---+------------------+


scala> val pivoted = grouped.groupBy("c").pivot("a").agg(first("b"))
pivoted: org.apache.spark.sql.DataFrame = [c: double, 1: string]

scala> pivoted.show
+------------------+---+
|                 c|  1|
+------------------+---+
|6.51553220271779E7|  a|
+------------------+---+
问题出现在透视图之后,我将在这里看到2行,而不是预期的单行

这是预期的吗?虫子?有解决办法吗?我尝试过使用BigDecimal vs double、舍入、UDF vs column表达式,但到目前为止没有任何帮助。谢谢大家!

预计:

  • 浮点运算是一种新的算法。Spark中聚合的顺序是不确定的,结果也是不确定的
  • 浮动不是分组键的好选择。它们没有意义上的相等(通常检查差异是否小于机器精度)。在Spark中,聚合是基于哈希的,您甚至不能使用这种相等的概念

一种可能的解决方法是将c乘以10的某个倍数(以匹配所需的精度),然后将其四舍五入为整数,然后按其分组。