如何使用Scala访问行并能够在Spark数据帧中来回移动

时间:2018-08-27 16:07:01

标签: scala apache-spark

我正在尝试解决以下问题:

输入数据框:

+------+------+------------+
|emp   |Group |Spouse      |
+------+------+------------+
|John  |L1    |Dana        |
|Mary  |L1    |Rick        |
|Harry |L3    |Dana        |
|Linda |L3    |Harry       |
|Jim   |L3    |Mary        |
+------+------+------------+

逻辑:雇员的配偶不能与雇员属于同一组(必须从列表中删除那些配偶所在的行)

输出数据框:

+------+------+------------+
|Emp   |Group |Spouse      |
+------+------+------------+
|John  |L1    |Dana        |
|Mary  |L1    |Rick        |
|Linda |L3    |Harry       |
|Jim   |L3    |Mary        |
+------+------+------------+

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

会为您解决吗?

df.createOrReplaceTempView("empl")

sql("select a.emp, a.Group, a.Spouse from empl a where exists (select 1 from empl b where a.Spouse = b.emp and a.Group <> b.Group)").show

答案 1 :(得分:0)

根据配偶和组列将数据框左连接为自身,然后根据连接的DF中的非空内容进行过滤,如果不需要,则删除连接的DF。像这样:

df.join(df.select($"emp".as("s_e"), $"Spouse".as("s_s"), $"Group".as("s_g")),
    $"emp" <=> $"s_s" && $"Group" <=> $"s_g", "left").
  filter($"s_e".isNull).
  drop($"s_e", $"s_s", $"s_g")