不同 ID 的最旧记录 - SparkSQL [重复]
Posted
技术标签:
【中文标题】不同 ID 的最旧记录 - SparkSQL [重复]【英文标题】:Oldest Record For a Distinct ID - SparkSQL [duplicate] 【发布时间】:2018-12-17 08:55:18 【问题描述】:我在这里比较新,所以我会尝试遵循SO的手段。
我正在研究数据块上的 spark 并使用以下数据:
Distinct_Id Event Date
*some alphanumerical value* App Access 2018-01-09
*some alphanumerical value* App Opened 2017-23-01
... ... ...
数据意味着:
每个 distinct_id 标识一个不同的用户。有 4 个主要事件 - 应用访问、应用打开、应用启动、媒体就绪。
问题:
我正在尝试查找特定 distinct_id 的第一个应用程序访问日期。 应用访问定义为:event in ('App access', 'App opens', 'App Launched')
第一个应用查看特定 distinct_id 的日期。 App 查看定义为:event == 'mediaReady'
我的数据存在于 parquet 文件中,数据量巨大(2 年数据)。
我尝试了以下方法来查找第一个应用访问日期:
temp_result = spark.sql("
with cte as(
select gaid,
event,
event_date,
RANK() OVER (PARTITION BY gaid order by event_date) as rnk
from df_raw_data
WHERE upper(event) IN ('APP LAUNCHED', 'APP OPENED', 'APP ACCESS')
group by gaid,event,event_date
)
select DISTINCT gaid, event_date, event from cte where rnk = 1
")
我正在尝试编写一个健壮的查询,该查询将随着数据的增加而扩展并给出结果。 我希望我已经以体面的方式描述了这个问题。
【问题讨论】:
您的问题到底是什么?查询似乎是正确的。 任何 distinct_id 可能有多个与其关联的事件(“应用程序访问”、“应用程序打开”),这些事件实际上定义了 app_access。我有点不确定我的查询是否解决了这个问题,只是给了我唯一的 distinct_id 和他们的第一个应用程序访问日期(这是 3 个事件的组合)。 【参考方案1】:感觉更像是一个透视查询:
SELECT
gaid,
MIN(CASE WHEN event in ('App access', 'App opened', 'App Launched') THEN date END) as first_app_access_date,
MIN(CASE WHEN event in ('mediaReady') THEN date END) as first_app_viewed_date
FROM df_raw_data
GROUP BY gaid
我不知道 spark db 的大小写敏感等问题,因此您可能需要解决其中的一些问题..
【讨论】:
感谢您的回复,凯厄斯。但是这个查询是否解决了这个问题:任何 distinct_id 都可能有多个与之关联的事件(“应用程序访问”、“应用程序打开”),这些事件实际上定义了 app_access。我有点不确定我的查询是否解决了这个问题,只是给了我唯一的 distinct_id 和他们的第一个应用访问日期(这是 3 个事件的组合)? 您说三件事中的任何一件都可以定义“首次应用访问日期”。这个查询就是这样做的;如果发生这 3 件事中的任何一个,则它是作为第一次访问日期给出的任何事情的第一次出现以上是关于不同 ID 的最旧记录 - SparkSQL [重复]的主要内容,如果未能解决你的问题,请参考以下文章