基于列值数据和应用条件的Pyspark过滤

时间:2020-10-06 11:32:26

标签: python pyspark apache-spark-sql pyspark-dataframes

我有这种格式的pyspark数据框。

out.show(5)
+----------------+--------+--
|ip_address| Device  | Count |
+----------------+--------+--
|2.3.4.5  |   Apple  |     6 |
|1.2.3.4  |  Samsung |     18|
|6.6.6.6  |   MI     |     8 |
|4.4.4.4  |   Samsung|     12|
|8.8.8.8  |   Apple  |     16|
|9.9.9.9  |   Samsung|      8|
+----------------+--------+---

我想获得输出,其中输出添加满足两个条件的结果

  • “设备”为“三星”,“计数”> 10
  • 如果“计数”> 8,则
  • 其他任何“设备”类型

最终输出应该是这样

+----------------+--------+--
|ip_address| Device  | Count |
+----------------+--------+--
|1.2.3.4   |  Samsung|   18  |
|4.4.4.4   |  Samsung|    12 |
|8.8.8.8   |   Apple |    16 |

因此,我可以想到的一种方法是通过过滤设备类型并应用条件来进行此类操作,但是我想知道是否可以使用if else然后将两个条件输出并置

frSamsung = out.filter(out["Device"].rlike("Samsung"))
 fpr=frSamsung.filter(frSamsung.Count > 10)

2 个答案:

答案 0 :(得分:2)

基本上,这里需要复合条件,数量取决于具有2种不同条件的设备类型-

from pyspark.sql import functions as F

df.where((
         ((F.col("device") == 'Samsung') & (F.col("count") > 10 )) | 
         ((F.col("device") != 'Samsung') & (F.col("count") > 8 )) 
)).show()

答案 1 :(得分:1)

假设df是您的数据框:

from pyspark.sql import functions as F

df.where(
    """
    Device = 'Samsung' and Count > 10
    or Device <> 'Samsung' and count > 8
    """
).show()