PySpark中的等效熊猫遮罩和移动

时间:2019-01-23 09:52:21

标签: apache-spark pyspark pyspark-sql

我一直在Python上构建应用程序,但由于某种原因,我需要将其放在分布式环境中,因此我正在尝试构建和应用程序

使用Spark,但在Pandas中无法提供与shift一样快的代码。

enter image description here

mask = (df['name_x'].shift(0) == df['name_y'].shift(0)) & \ 
(df['age_x'].shift(0) == df['age_y'].shift(0))
df = df[~mask1]

哪里

mask.tolist()                                               

给予

[True, False, True, False]

最终结果df将仅包含两行(第二和第四行)。 基本上是尝试删除[name_y,age_y] col上存在[name_x,age_x] col重复的行。

以上代码位于Pandas数据框上。效率最高但不导入Pandas的最接近的PySpark代码是什么?

我在Spark上检查了Window,但不确定。

1 个答案:

答案 0 :(得分:1)

shift在您的代码中不起作用。

import pandas as pd 

df = pd.DataFrame({
    "name_x" : ["ABC", "CDF", "DEW", "ABC"],
    "age_x": [20, 20, 22, 21],
    "name_y" : ["ABC", "CDF", "DEW", "ABC"],
    "age_y" : [20, 21, 22, 19],
})

mask1 = (df['name_x'].shift(0) == df['name_y'].shift(0)) & \
  (df['age_x'].shift(0) == df['age_y'].shift(0))
df[~mask1]

#  name_x  age_x name_y  age_y
# 1    CDF     20    CDF     21
# 3    ABC     21    ABC     19

等同于

mask2 = (df['name_x'] == df['name_y']) & (df['age_x'] == df['age_y'])
df[~mask2]

#   name_x  age_x name_y  age_y
# 1    CDF     20    CDF     21
# 3    ABC     21    ABC     19

因此,您所需要做的只是过滤器:

sdf = spark.createDataFrame(df)

smask = ~((sdf["name_x"] == sdf["name_y"]) & (sdf["age_x"] == sdf["age_y"]))
sdf.filter(smask).show()
# +------+-----+------+-----+
# |name_x|age_x|name_y|age_y|
# +------+-----+------+-----+
# |   CDF|   20|   CDF|   21|
# |   ABC|   21|   ABC|   19|
# +------+-----+------+-----+

根据De Morgan的定律,可以简化为

(sdf["name_x"] != sdf["name_y"]) | (sdf["age_x"] != sdf["age_y"])

通常,shift可以用Window functions表示。