我有两个星火数据帧:

其一是:

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)

Sql相关问答推荐

前面的语句不喜欢AND LIKE?当try 更新使用ID和日期过滤的表时

按每天的最大值分组

判断序列索引处的序列是否完整

带上最后日期(结果)

如何根据行状态设置正确的标志

如何在多列上编写具有不同条件的查询?

SQL中相同表内的VLOOKUP等价

将 jsonb 数组中的对象取消嵌套到单独的行中

如何根据 SQL 中的阈值标记一个集群中的所有值?

连续天跟踪购买情况(将标记返回到另一列?)

Postgresql 生成器列导致语法错误

多行状态下的分组查询判断状态

所有列分组的简写?

如何将特定值从 JSON 列中的一个字段移动到 PostgreSQL 中的另一个字段?

SQL 函数 DIFFERENCE 返回有趣的分数

为 sqlite 全文搜索 (fts) 创建触发器时出现虚拟表的不安全使用

在 SQL 的每行选项中 Select 最大值

将单行中的多个行值转换为列

如何根据 ID 和指标从 2 个表中找到不同的值?

Snowflake SQL group-by 的行为不同,具体取决于列是按位置引用还是按别名引用