如何使用 joinWith 连接 2 个以上的数据集?
How do I use joinWith to join more than 2 datasets?
我想实现这样的目标:
x.joinWith(y, x(id) === y(fid), "left_outer")
.joinWith(z, x(id) === z(fid))
.map(case {(x, y, z) => combineXYZ(x, y, z)})
当你使用joinWith
时,你得到的是一个新的元组数据集:(x, y)
。所以列名是 _1
和 _2
.
因此,当您进行第二次联接时,您需要引用元组中的列名,而不是源数据集中的一个。像这样:
x.joinWith(y, x(id) === y(fid), "left_outer").joinWith(z, $"_1.id" === z(fid))
现在,您得到的是一个 tuple2,其中第一个元素也是一个元组:((x, y), z)
。所以你必须像这样做你的地图:
.map(case {((x, y), z) => combineXYZ(x, y, z)})
这应该有效。请注意,如果您不想使用 $"_1.id
,这是完全可以理解的,您可以在第一次加入后做一个映射,以创建一个新对象,而不是 tuple2,以获得正确的列名。
我想实现这样的目标:
x.joinWith(y, x(id) === y(fid), "left_outer")
.joinWith(z, x(id) === z(fid))
.map(case {(x, y, z) => combineXYZ(x, y, z)})
当你使用joinWith
时,你得到的是一个新的元组数据集:(x, y)
。所以列名是 _1
和 _2
.
因此,当您进行第二次联接时,您需要引用元组中的列名,而不是源数据集中的一个。像这样:
x.joinWith(y, x(id) === y(fid), "left_outer").joinWith(z, $"_1.id" === z(fid))
现在,您得到的是一个 tuple2,其中第一个元素也是一个元组:((x, y), z)
。所以你必须像这样做你的地图:
.map(case {((x, y), z) => combineXYZ(x, y, z)})
这应该有效。请注意,如果您不想使用 $"_1.id
,这是完全可以理解的,您可以在第一次加入后做一个映射,以创建一个新对象,而不是 tuple2,以获得正确的列名。