Dataframe 根据第二个数据帧中的事件筛选一个数据帧。皮斯帕克。需要优雅的解决方案

Dataframe 根据第二个数据帧中的事件筛选一个数据帧。皮斯帕克。需要优雅的解决方案,dataframe,apache-spark,pyspark,apache-spark-sql,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我有一个问题。我们有两个输入数据帧-upper_in和lower_in,我们需要根据DF中lower_中出现的事件过滤DF中upper_的行。 这意味着,如果行中从上到下的行位于下,则该行将写入新的DF(uppper\U out)。 如果来自上_-in的行不在下_-in,则它将写入其他DF(下_-out) 我的直截了当的解决方案: 迭代DF中的upper_,您可以使用和检查upper_in中lower_in中upper_的行的出现情况: upper_out = upper_in.interse

我有一个问题。我们有两个输入数据帧-upper_in和lower_in,我们需要根据DF中lower_中出现的事件过滤DF中upper_的行。 这意味着,如果行中从上到下的行位于下,则该行将写入新的DF(uppper\U out)。 如果来自上_-in的行不在下_-in,则它将写入其他DF(下_-out)

我的直截了当的解决方案:

  • 迭代DF中的upper_,您可以使用和检查
    upper_in
    lower_in
    upper_的行的出现情况:

    upper_out = upper_in.intersectAll(lower_in)
    lower_out = upper_in.exceptAll(lower_in)
    
    或者,您可以对所有列执行或联接:

    upper_out = upper_in.join(lower_in, upper_in.columns, 'left_semi')
    lower_out = upper_in.join(lower_in, upper_in.columns, 'left_anti')
    
    如果要指定要检查的列列表,可以执行以下操作:

    cols = ['Location']
    upper_out = upper_in.join(lower_in, cols 'left_semi')
    lower_out = upper_in.join(lower_in, cols, 'left_anti')
    

    为什么不直接使用join?@blackishop听起来是个好主意,但如果我使用join(显然是内部的),哪里会存储不相似的行?分别。不在下部,但有其他类型的连接,不仅仅是内部连接(左、半等)。你也可以在这里使用。你不认为join在数百万行的情况下会很慢吗?第二,这种情况下什么样的连接是最好的?上帝的解决方案,谢谢。但如果我想指定需要过滤的列,该怎么办呢。示例:“Location”列位于upper\u in和lower\u in中,我们需要过滤类似的内容,将整行写入upper\u out,否则写入lower\u out。在一个cloumn的情况下并没有那个么有用,但关键是要过滤多个列选择by@OleksandrLytvyn参见编辑后的答案?
    cols = ['Location']
    upper_out = upper_in.join(lower_in, cols 'left_semi')
    lower_out = upper_in.join(lower_in, cols, 'left_anti')