【问题标题】:Pyspark dataframe operator "IS NOT IN"Pyspark 数据框运算符“不在”
【发布时间】:2017-03-10 07:01:57
【问题描述】:

我想将它从 R 重写为 Pyspark,有什么好看的建议吗?

array <- c(1,2,3)
dataset <- filter(!(column %in% array))

【问题讨论】:

    标签: pyspark


    【解决方案1】:

    您可以使用.subtract() 好友。

    例子:

    df1 = df.select(col(1),col(2),col(3)) 
    df2 = df.subtract(df1)
    

    这样,df2 将被定义为所有不是 df1 的 df。

    【讨论】:

      【解决方案2】:

      在 pyspark 中你可以这样做:

      array = [1, 2, 3]
      dataframe.filter(dataframe.column.isin(array) == False)
      

      或者使用二元非运算符:

      dataframe.filter(~dataframe.column.isin(array))
      

      【讨论】:

      • **array 中的工作是什么?
      • *variable 是 python 语法,用于扩展数组以将其元素依次转储到函数参数中。
      • 请注意dataframe.column 区分大小写!或者,您可以使用字典语法dataframe[column],这不是:)
      • @rjurney 没有。== 操作符在这里所做的是在 dataframe.column.isin(*array) 返回的 Column 结果上调用重载的 __eq__ 方法。这被重载以返回另一个列结果以测试与另一个参数的相等性(在本例中为False)。 is 运算符测试对象身份,即对象是否实际上在内存中的相同位置。如果你在这里使用is,它总是会失败,因为常量False 不会与Column 位于相同的内存位置。此外,您不能重载is
      • List splatting with * 在这里没有任何区别。你可以使用isin(array),它工作得很好。
      【解决方案3】:

      * 不需要。所以:

      list = [1, 2, 3]
      dataframe.filter(~dataframe.column.isin(list))
      

      【讨论】:

        【解决方案4】:

        你也可以循环数组和过滤器:

        array = [1, 2, 3]
        for i in array:
            df = df.filter(df["column"] != i)
        

        【讨论】:

        • 我不建议在大数据应用程序中使用它...这意味着您需要遍历整个数据集树的时间...如果您想象自己只有几 TB 需要处理,这将是巨大的跨度>
        • 不,因为 Spark 在内部优化了这个过滤器,使这个过滤器的时间是这个过滤器的 1 倍。
        • 那么应该没问题...直到新的重大更改 Spark 更新或框架切换...和 ​​3 行而不是 1 行 + 隐藏优化对我来说似乎仍然不是好的模式...没有冒犯,但我仍然建议避免它
        【解决方案5】:

        取运算符~,表示相反

        df_filtered = df.filter(~df["column_name"].isin([1, 2, 3]))
        

        【讨论】:

        • 这里的每个人,这不应该是公认的答案吗?当我们有专门用于否定的~ 时,为什么要使用这个不太明显的== False
        • 另外,* 没用
        【解决方案6】:

        略有不同的语法和“日期”数据集:

        toGetDates={'2017-11-09', '2017-11-11', '2017-11-12'}
        df= df.filter(df['DATE'].isin(toGetDates) == False)
        

        【讨论】:

          【解决方案7】:
          df_result = df[df.column_name.isin([1, 2, 3]) == False]
          

          【讨论】:

            猜你喜欢
            • 2017-03-06
            • 1970-01-01
            • 1970-01-01
            • 2017-03-24
            • 2022-06-10
            • 2016-12-31
            • 2017-10-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多