【问题标题】:SPARK SQL LEFT JOIN too many rowsSPARK SQL LEFT JOIN 太多行
【发布时间】:2016-08-29 20:04:09
【问题描述】:

使用火花 1.6.1。

有一些奇怪的情况:两个表:timeevents 和 apps 都有 key id - device,当我这样做时:

从 timeevents 中选择设备 - 返回的记录数为 60865

从 timeevents 中选择区别设备 - 返回的记录数为 60865

从应用中选择设备 - 记录:112071

从应用中选择不同的设备 - 记录:112071

当我跑步时:

从应用程序中选择应用程序.*, timeevents.* 左外连接 timeevents ON apps.device = timeevents.device

返回的记录数为 112073...

我检查了 - 在输出中 - 我有 2 行具有相同的设备 ID... 我是不是做错了什么??

我期待 112071 - 只是应用程序表中的数字...

编辑:按照建议尝试:

SELECT device FROM timeevents  GROUP BY device  HAVING COUNT(*) > 1
return 0

SELECT device FROM apps GROUP BY device    HAVING COUNT(*) > 1
return 0

SELECT device FROM timeevents  GROUP BY device  HAVING COUNT(1) < 2
return 60865

SELECT device FROM apps GROUP BY device    HAVING COUNT(1) < 2
return 112071

编辑: 对不起,我的错 - 在 timeevents 设备(作为原始 RDD)中没有注意到它是字符串,在应用程序中是长的......仍然没有解释行为但是当我强制它们在两者中都是长时 - 没有更多神秘的行。噗……

感谢您的帮助!

【问题讨论】:

  • 该设备必须有 2 个应用记录。它也必须在其他地方发生,因为您正在从另一台设备获得额外的记录
  • 我不是最好的 spark...但是从 timeevents 组中选择设备,按 count(1) > 1 的设备应该为您提供重复的设备条目

标签: sql apache-spark


【解决方案1】:

您的加入不是一对一的。在 timeevents 表中查找重复项:

SELECT device
FROM timeevents
GROUP BY device
HAVING COUNT(*) > 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多