当前位置: 首页 > 知识库问答 >
问题:

DataFrame/Dataset连接在Spark 2.0/Yarn中没有产生正确的结果

陶俊晤
2023-03-14

我们在Hadoop 2.7.2和Centos 7.2上运行Apache Spark 2.0的集群。我们使用Spark DataFrame/DataSet API编写了一些新代码,但在写入并将数据读取到Windows Azure存储Blob(默认HDFS位置)后,注意到连接上的结果不正确。我已经能够使用在群集上运行的以下代码片段复制该问题。

case class UserDimensions(user: Long, dimension: Long, score: Double)
case class CentroidClusterScore(dimension: Long, cluster: Int, score: Double)

val dims = sc.parallelize(Array(UserDimensions(12345, 0, 1.0))).toDS
val cent = sc.parallelize(Array(CentroidClusterScore(0, 1, 1.0),CentroidClusterScore(1, 0, 1.0),CentroidClusterScore(2, 2, 1.0))).toDS

dims.show
cent.show
dims.join(cent, dims("dimension") === cent("dimension") ).show

输出

+-----+---------+-----+                                                         
| user|dimension|score|
+-----+---------+-----+
|12345|        0|  1.0|
+-----+---------+-----+

+---------+-------+-----+
|dimension|cluster|score|
+---------+-------+-----+
|        0|      1|  1.0|
|        1|      0|  1.0|
|        2|      2|  1.0|
+---------+-------+-----+

+-----+---------+-----+---------+-------+-----+
| user|dimension|score|dimension|cluster|score|
+-----+---------+-----+---------+-------+-----+
|12345|        0|  1.0|        0|      1|  1.0|
+-----+---------+-----+---------+-------+-----+

这是正确的。然而,在写入和读取数据之后,我们看到了这一点

dims.write.mode("overwrite").save("/tmp/dims2.parquet")
cent.write.mode("overwrite").save("/tmp/cent2.parquet")

val dims2 = spark.read.load("/tmp/dims2.parquet").as[UserDimensions]
val cent2 = spark.read.load("/tmp/cent2.parquet").as[CentroidClusterScore]

dims2.show
cent2.show

dims2.join(cent2, dims2("dimension") === cent2("dimension") ).show

输出

+-----+---------+-----+                                                         
| user|dimension|score|
+-----+---------+-----+
|12345|        0|  1.0|
+-----+---------+-----+

+---------+-------+-----+
|dimension|cluster|score|
+---------+-------+-----+
|        0|      1|  1.0|
|        1|      0|  1.0|
|        2|      2|  1.0|
+---------+-------+-----+

+-----+---------+-----+---------+-------+-----+
| user|dimension|score|dimension|cluster|score|
+-----+---------+-----+---------+-------+-----+
|12345|        0|  1.0|     null|   null| null|
+-----+---------+-----+---------+-------+-----+

但是,使用RDDAPI会产生正确的结果

dims2.rdd.map( row => (row.dimension, row) ).join( cent2.rdd.map( row => (row.dimension, row) ) ).take(5)

res5: Array[(Long, (UserDimensions, CentroidClusterScore))] = Array((0,(UserDimensions(12345,0,1.0),CentroidClusterScore(0,1,1.0))))

我们尝试将输出格式更改为ORC而不是拼花地板,但我们看到了相同的结果。在本地而不是群集上运行Spark 2.0不会出现此问题。在Hadoop集群的主节点上以本地模式运行火花也可以工作。只有在纱线上运行时,我们才会看到这个问题。

这似乎也与这个问题非常相似:https://issues.apache.org/jira/browse/SPARK-10896

共有1个答案

莘钧
2023-03-14

此问题已通过中提交的拉取请求修复https://issues.apache.org/jira/browse/SPARK-17806

 类似资料:
  • 问题内容: 我需要在Java中执行一些浮点运算,如下面的代码所示: 这是为了模拟Betfair Spinner小部件作为输出给出的值的范围。 Java中的浮点算术似乎引入了一些意外错误。例如,我得到2.180000000000001而不是2.18。浮点数有什么用,您不相信对它们执行的算术结果吗?我该如何解决这个问题? 问题答案: 如果您需要精确的十进制值,则应使用java.math.BigDeci

  • 问题内容: 我试图在我的机器上安装Kibana 4,但出现以下错误。 问题答案: 该告诉你,它不能连接到Elasticsearch。该告诉你什么它试图连接到。 您需要修改和更改设置以指向您的集群。如果您在同一框上运行Elasticsearch,则正确值为。

  • 片段着色器 结果是一个绿色屏幕,里面有一个黑色矩形。但我希望长方形改为蓝色。我的代码有问题吗?

  • 问题内容: 我最近一直在尝试使我制作的程序自动化,但是遇到了一个问题,robot.mouseMove(100,100)不会将鼠标发送到100,100。 我做了一个简单的程序来展示这一点: 每次我运行此代码都会产生不同的结果: 当您将其循环放置时,鼠标会接近正确的位置。代码: 结果: 我不知道发生了什么,但任何帮助将不胜感激。谢谢。为了澄清我正在运行Windows 10和Java版本1.8.0_16

  • 问题内容: 所以,我有一个看起来像这样的目录结构: 在每个目录中,都有多个sass部分(通常是 .css.scss,但是一个或两个 .css.scss.erb)。 我可能有很多假设,但是rails应该由于application.css中的内容自动编译那些目录中的所有文件,对吗? 我最近尝试通过删除所有颜色变量并将它们放置在根文件夹(_colors.css.scss)中的文件中来重组这些文件。然后,

  • 我正在使用Jpa和Hibernate。 我的项目中发生了一件非常奇怪的事情。 我有两个实体:学生和课程,多对多的关系。 很长一段时间内,一切都运行得很好,但突然我遇到了这个问题: 当我找到一个特定的学生(em.find)并使用getter(student.getcourses)返回其课程列表时,我只收到列表的一部分!如果我使用一个查询(“Select s.cources from Students