Spark 数据集 - 内部连接问题

Posted

技术标签:

【中文标题】Spark 数据集 - 内部连接问题【英文标题】:Spark Datasets - Inner Join Issue 【发布时间】:2016-08-23 07:19:31 【问题描述】:

我使用的是 Spark 2.0.0,我有两个数据集 (Dataset[Row]),如下所示。

数据集'appUsage':

+----------+-------------------+----------+
|DATE      |APP_ID             |TIMES_USED|
+----------+-------------------+----------+
|2016-08-03|06xgKq10eeq0REK4eAc|null      |
|2016-08-03|ssads2wsdsf        |null      |
|2016-08-03|testApp            |null      |
|2016-08-03|3222aClie-971837083|5         |
|2016-08-03|V2aadingTLV02      |null      |
|2016-08-03|OurRating-985443645|5         |
|2016-08-03|Trdssktin-743439164|null      |
|2016-08-03|myaa1-app          |null      |
|2016-08-03|123123123-013663450|null      |
+----------+-------------------+----------+

数据集'appDev'

+-------------------+------------------------------------+
|APP_ID             |DEVELOPER_ID                        |
+-------------------+------------------------------------+
|OurRating-985443645|5fff25c7-6a70-4d54-ad04-197be4b9a6a9|
|Xa11d0-560090096095|5fff25c7-6a70-4d54-ad04-197be4b9a6a9|
+-------------------+------------------------------------+

当我使用以下代码进行左连接时,一切都按预期工作。

val result = appUsage.join(appDev, Seq("APP_ID"), "left")

输出是:

+-------------------+----------+----------+------------------------------------+
|APP_ID             |DATE      |TIMES_USED|DEVELOPER_ID                        |
+-------------------+----------+----------+------------------------------------+
|06xgKq10eeq0REK4eAc|2016-08-03|null      |null                                |
|ssads2wsdsf        |2016-08-03|null      |null                                |
|testApp            |2016-08-03|null      |null                                |
|3222aClie-971837083|2016-08-03|5         |null                                |
|V2aadingTLV02      |2016-08-03|null      |null                                |
|OurRating-985443645|2016-08-03|5         |5fff25c7-6a70-4d54-ad04-197be4b9a6a9|
|Trdssktin-743439164|2016-08-03|null      |null                                |
|myaa1-app          |2016-08-03|null      |null                                |
|123123123-013663450|2016-08-03|null      |null                                |
+-------------------+----------+----------+------------------------------------+

但我想做一个内部连接,这样只有两个数据集中存在的行才会成为结果集的一部分。但是,当我使用以下代码执行此操作时,输出为空。

val result = appUsage.join(appDev, Seq("APP_ID"), "inner")

我错过了什么吗?

【问题讨论】:

【参考方案1】:

试试这个:

val result = appUsage.join(appDev, "APP_ID")

我在Databrics cloudSpark 2.0.0 上试了一下,效果很好。

请参考this。

【讨论】:

问题不在于特定的连接。我正在使用一系列外连接构建上面的“appUsage”数据集。似乎 Spark 优化器正在更改连接的顺序或导致此问题的某些东西。我将作为一个单独的问题提出。当我将该外连接更改为左连接时, appUsage.join(appDev, Seq("APP_ID"), "inner") 也可以正常工作。感谢您的帮助!

以上是关于Spark 数据集 - 内部连接问题的主要内容,如果未能解决你的问题,请参考以下文章

使用spark数据帧/数据集/ RDD使用内部联接进行更新

Spark 数据集连接和聚合列

Spark 数据集 Joinwith 错误:连接条件丢失或不重要

Spark 连接数据框和数据集

使用 Scala 在 Apache Spark 中连接不同 RDD 的数据集

Java Spark:使用未知连接列名称连接的数据集的 Spark 错误解决方法