【发布时间】:2018-04-16 08:45:22
【问题描述】:
我有一个 Spark 1.6 数据框(3 列),其记录格式如下 -
----------
w p s
----------
w1 p1 0
w1 p1 1
w1 p1 2
w1 p2 0
w1 p2 1
w2 p1 0
w2 p1 1
w2 p3 0
w2 p3 1
w2 p3 2
w2 p4 0
w1 p4 1
w3 p1 0
w3 p1 1
w3 p2 0
w3 p3 0
w3 p4 0
w4 p1 0
w4 p1 1
// 根据更新的输入更新输出 接下来我想对其进行转换以获取在第 2 列和第 3 列中具有相同值的行,如下所示,消除所有不常见的记录 w -
----------
w p s
----------
w1 p1 0
w1 p1 1
w2 p1 0
w2 p1 1
w3 p1 0
w3 p1 1
w4 p1 0
w4 p1 1
我尝试使用自连接,但我得到了输入数据帧中的所有记录,我能想到的另一种方法是获得 w 和 p 的独特组合并将其与输入数据帧连接,然后获得 p 和s 并将其与输入数据框连接起来。
谁能给我一个更好的方法来实现所需的输出。
//更新 - 使用自我加入 我使用了以下自联接查询-
df.registerTempTable("t")
sqlContext.sql("select distinct t1.w,t1.p,t1.s FROM t AS t1 JOIN t AS t2 ON t1.p = t2.p and t1.s = t2.s where t1.w != t2.w")
导致以下输出,p2、p3、p4 不会在所有 w 中重叠,因此它们不应出现在输出中 -
w1 p1 0
w1 p1 1
w2 p1 0
w2 p1 1
w3 p1 0
w3 p1 1
w4 p1 0
w4 p1 1
w1 p2 0
w2 p3 0
w2 p4 0
w3 p2 0
w3 p3 0
w3 p4 0
// 使用窗口函数更新,我没有经常使用窗口函数,所以我尝试了这个简单的查询,但我不确定如何获得所需的结果,我很接近但不确定什么是失踪-
val df1 = sqlContext.sql("select w,p,s, row_number() over ( order by p,s) as rn, rank() over ( order by p,s) as rk, dense_rank() over ( order by p,s) as dr from t")
val df2 = sqlContext.sql("select w,p,s, row_number() over (partition by p order by p,s) as rn, rank() over (partition by p order by p,s) as rk, dense_rank() over (partition by p order by p,s) as dr from t")
感谢任何帮助
【问题讨论】:
-
如果我知道拒绝投票的原因,我将不胜感激
标签: sql scala apache-spark apache-spark-sql