考虑到我有一个包含历史数据(2年)的表,这是在spark中运行以下查询后创建的:
temp_result = spark.sql("SELECT gaid,MIN(CASE WHEN upper(event) in ('APP
ACCESS', 'APP OPENED', 'APP LAUNCHED') THEN date_stamp_ist END) as
first_app_access_date,MIN(CASE WHEN upper(event) in ('MEDIAREADY', 'MEDIA
READY') THEN date_stamp_ist END) as first_app_viewed_date FROM df_raw_data
GROUP BY gaid")
数据如下所示:
gaid | first_app_access_date | first_app_viewed_date |
00001C8A-2326-469... | 2018-09-03 | 2018-09-03 |
00021783-C199-4FE... | 2018-09-01 | 2018-09-01 |
0003432f-6e30-4c0... | 2018-09-04 | 2018-09-04 |
000662ae-2b9b-468... | 2018-09-02 | 2018-09-02 |
0009ac47-c7a2-4b6... | 2018-09-01 | 2018-09-01 |
000c245b-58b1-492... | 2018-09-03 | 2018-09-03 |
000f327b-56dc-4c8... | 2018-09-01 | 2018-09-01 |
001149cb-f51c-4c0... | 2018-09-01 | 2018-09-01 |
0013ad65-2843-4d3... | 2018-09-04 | 2018-09-04 |
0015170a-fda1-41c... | 2018-09-05 | 2018-09-05 |
001cf486-035a-43e... | 2018-09-04 | 2018-09-04 |
001f2ecf-bf0f-47d... | 2018-09-03 | null |
002053e8-2cf6-43f... | 2018-09-04 | 2018-09-04 |
002303e0-5aa4-4eb... | 2018-09-01 | 2018-09-01 |
0025f65c-5818-4c3... | 2018-09-01 | null |
002807db-b0a2-487... | 2018-09-03 | 2018-09-03 |
002befcc-cdfd-463... | 2018-09-01 | 2018-09-01 |
00364046-b022-497... | 2018-09-02 | null |
我想要做的是为用户找到第一个应用访问和第一个应用视图(gaid)。
现在,当我针对新月数据运行时,我想:
验证新数据中的gaid是否存在于历史数据中。
如果它存在,这意味着我们已经拥有第一个应用程序访问权限,我们什么都不做。
如果历史数据中没有gaid(这意味着它是一个新ID),它应该运行相同的查询来计算第一个应用访问和第一个应用视图,并将其插入到历史数据中。
对于特定的gaid,必须首先进行应用访问,并且第一个应用视图可以为空,因为一个人可以访问但稍后查看某些内容。
对于此类条目,它应更新历史数据中的第一个应用程序视图。
对于1/2/3,我认为你应该使用RoaringBitmap来存储你的gaids,这意味着你需要将gaid转换为int数。但是,您需要注意转换,因为您无法以String.hashCode()之类的简单方式执行此操作,这可能会在RoaringBitmap中引入int冲突。
对于4/5,它显然不是像HDFS这样的仅附加文件系统的典型场景。为了实现这一点,您必须利用一些外部分布式数据库或框架,如HBase,RocksDB和Alluxio。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。