我有两个星火数据帧:
其一是:
name start end
bob 1 3
john 5 8
第二个是:
day outcome
1 a
2 c
3 d
4 a
5 e
6 c
7 u
8 l
我需要每个人的连续几天的结果,比如
bob acd
john ecul
有没有可能在火星火中做到这一点?
我有两个星火数据帧:
其一是:
name start end
bob 1 3
john 5 8
第二个是:
day outcome
1 a
2 c
3 d
4 a
5 e
6 c
7 u
8 l
我需要每个人的连续几天的结果,比如
bob acd
john ecul
有没有可能在火星火中做到这一点?
使用SPARK-SQL. 我使用的是Scala,但pyspark中的SQL是完全相同的,我相信如果pyspark有任何不同,您可以很容易地进行转换.
连接两个数据帧,使用Collect_List()获取结果数组,然后使用conat_ws()将数组连接为字符串:
val dF1 = Seq(
("bob", 1, 3),
("john", 5, 8)
).toDF("name","start","end")
dF1.createOrReplaceTempView("dF1")
val dF2 = Seq(
(1, "a"),
(2, "c"),
(3, "d"),
(4, "a"),
(5, "e"),
(6, "c"),
(7, "u"),
(8, "l")
).toDF("day","outcome")
dF2.createOrReplaceTempView("dF2")
spark.sql("""
select d1.name, concat_ws('',collect_list(d2.outcome)) outcome
from
(select d1.name, e.day
from dF1 d1
lateral view explode(sequence(d1.start, d1.end)) e as day
)d1
left join dF2 d2 on d1.day=d2.day
group by d1.name
""").show(100, false)
Result:个
+----+-------+
|name|outcome|
+----+-------+
|bob |acd |
|john|ecul |
+----+-------+
修复OOM:
spark.sql("""
select d1.name, concat_ws('',collect_list(d2.outcome)) outcome
from dF1 d1
left join dF2 d2 on d1.start<=d2.day and d1.end>=d2.day
group by d1.name
""").show(100, false)