【发布时间】:2016-04-27 08:54:29
【问题描述】:
我正在努力解决我认为非常简单的问题,但我不确定是否也会发生一些火花巫毒。
我有两张桌子,都非常小。 Table A 大约有 90K 行,Table B 大约有 2K 行。
表 A
A B C D
===========
a1 b1 c1 d1
a1 b1 c2 d2
a1 b1 c3 d3
a2 b2 c1 d1
a2 b2 c2 d2
.
.
.
表 B
A B E F
===========
a1 b1 e1 f1
a2 b2 e2 f2
我想要一张看起来像这样的桌子
结果表
A B C D E F
=================
a1 b1 c1 d1 e1 f1
a1 b1 c2 d2 e1 f1
a2 b2 c1 d1 e2 f2
.
.
.
我有点松散,但我的想法是我想将行数较少的表与行数较多的表连接起来,并且在最终表中具有多个关联值是可以的。
这应该很简单:
table_a.join(table_b, table_a.a == table_b.a, table_a.b == table_b.b).select(..stuff..)
但是,对于Result Table 中几乎所有的结果值(应该有大约 90K 行,因为 Table A 有大约 90K 行),我在列 @ 中得到 null 值987654331@和F。
当我只保存
Table B的结果时,我会看到所有的列和值。 当我只保存Table A的结果时,我看到了所有的列和值。 (即我可以做纸笔连接)
奇怪的是,尽管在 Result Table 的列 E 和 F 中有大约 89K 行有 null 值,但仍有一些值随机连接。
有谁知道发生了什么或者我该如何诊断?
【问题讨论】:
-
对不起,我可能误读了您的问题。你是说 E 和 F 列大多是空的?如果是这样,您为什么对它们在连接中也大多是空的感到惊讶?您的代码看起来正确,所以我想知道您对数据的理解是否是问题所在。首先,您可能想知道有多少行来自 B 甚至连接到 A(可能通过在基础 Spark 中进行连接)。您可能还需要考虑您是否期望 outer join or an inner join 并执行相反的操作(请参阅连接文档字符串中的“how”参数)。
-
@nightingalen 很抱歉造成混乱。我是说
Table A和Table B已满员。然后,当我加入它们时,我希望具有值的列(即E和F)是null。我想将小表Table B中的每一行与Table A的每一行相关联,该表已完全填充。当我对一些模拟数据帧进行单个单元测试时,它可以工作,但是当我在生产环境中运行时,我得到了null值。 -
您的数据来自哪里?您是即时生成列
E和F,还是以某种方式与其他列不同? -
@DavidGriffin 我即时生成
E和F。所以流程是:table_a_df = build_table_a(...)table_b_df = build_table_b(...)E 和F是从现有数据创建的result_df = table_a_df.join(table_b_df, ....) -
任何时候你不能从一个小数据集和一个大数据集区分 r 结果,那是因为你的代码没有正确序列化 - 这就是我知道询问这些是否是动态的。创建这些列的代码中的某些内容未序列化。与加入无关
标签: apache-spark pyspark apache-spark-sql