Spark SQL关联两个数据集视图结果行数不符求助
问题根源与解决办法
为什么结果条数远超预期?
你写的SQL是隐式内连接,逻辑是把ds1_view里每个userid的所有行,和ds2_view里同userid的所有行做笛卡尔积匹配。出现3500多万条的核心原因,大概率是你误以为ds2_view的userid唯一,但实际存在重复值——比如ds2_view里某个userid有100条记录,ds1_view里这个userid有10条,连接后就会生成10×100=1000条记录,总条数自然会爆炸。
如果ds2_view的userid确实唯一,那结果条数应该等于ds1_view中能匹配到ds2_view的行数(最多371815条),显然和你给出的结果不符,所以可以确定ds2_view的userid存在重复。
怎么得到预期的371815条结果?
你要的是保留ds1_view所有行,同时合并ds2_view对应userid的字段,应该用左连接,同时先确保ds2_view的userid唯一:
- 先检查
ds2_view的userid是否真的唯一:
SELECT userid, COUNT(*) as row_count FROM ds2_view GROUP BY userid HAVING row_count > 1;
如果有返回结果,说明存在重复,先去重生成新视图:
CREATE OR REPLACE VIEW ds2_view_unique AS SELECT DISTINCT userid, <替换成ds2_view的其他字段> FROM ds2_view;
- 用左连接获取预期结果:
SELECT * FROM ds1_view v1 LEFT JOIN ds2_view_unique v2 ON v1.userid = v2.userid;
左连接会保留ds1_view的全部371815条记录,ds1中找不到对应userid的行,ds2的字段会填充为NULL,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Chandeshwar Prasad sit
相关产品推荐
相关产品推荐

