问题
你执行内连接,但是结果加入表丢失数据。
例如,假设您有两个表,订单和模型。
% python df_orders =火花。createDataFrame(((“日产”,Altima,双门车2.5年代车),(“日产”,Altima, 4-door 3.5 SE轿车),(“日产”,Altima,”)(“日产”,Altima, None)],[“公司”,“模型”,“信息”)
% python df_models = spark.createDataFrame(((“日产”,Altima,”)(“日产”,Altima,双门车2.5年代车),(“日产”,Altima,双门车3.5 SE轿车),(“日产”,Altima, 4-door 2.5年代轿车),(“日产”,Altima, 4-door 3.5 SE轿车),(“日产”,Altima, 4-door 3.5 SL轿车),(“日产”,Altima, 4-door混合动力轿车),(“日产”,Altima, None)],[“公司”,“模型”,“信息”)
你尝试直接连接两个表。
% python df_orders.createOrReplaceTempView(“订单”)df_models.createOrReplaceTempView(“模型”)SQL复制到clipboardCopy SELECT *魔法从订单一个魔法内连接模型b魔法上。公司= b。魔法和一个公司。模型= b。魔法和一个模型。信息= b.Info
结果加入表只包括三四个记录的订单表。的记录零值一列没有出现在结果中。
导致
Apache火花不考虑零当执行连结操作值。
如果你试图加入表和一些列包含零值,零记录将不被包括在结果加入表。
解决方案
如果你的源表零值,您应该使用火花零安全操作符(< = >)。
当你使用< = >引发过程零值(而不是把他们)在执行连接。
例如,如果我们修改示例代码< = >,由此产生的表不下降零值。
%的sql SELECT *魔法从订单一个魔法内连接模型b魔法上。公司= b。魔法和一个公司。模型= b。魔法和一个模型。信息< = > b.Info