不同 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过其中一个属性找到关联的表最旧记录过滤?

从不同的记录更新产品表数量

根据其他列的最旧组成员的值重新编码整个组的列

我想让我的数据库里只保存最新的十条记录,超过十条,删除最旧的一条

1081. 不同字符的最小子序列

无法在 sparksql 中选择每组前 10 条记录