apache-spark - 使用 userID-SQL 上的新数据更新维护历史表
问题描述
考虑到我有一个包含历史数据(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 来存储你的 gaid,这意味着你需要将 gaid 转换为一个 int 数字。但是需要注意转换,因为不能像 String.hashCode() 这样简单的方式来做,可能会在 RoaringBitmap 中引入 int 冲突。
对于 4/5,这显然不是 HDFS 等仅附加文件系统的典型场景。为了实现这一点,您必须利用一些外部分布式数据库或框架,如 HBase、RocksDB 和 Alluxio。
推荐阅读
- reactjs - 代码拆分的动态导入:JSX 元素类型没有任何构造或调用签名
- java - 为什么双重行为如此不自然?
- bash - 用于将多个文本文件合并到一个文件中的 Shell 脚本失败
- postgresql - 在 PostgreSQL 中搜索相似词的好方法
- tensorflow - Tensorflow 对象检测没有给出名为“部署”的模块
- wordpress - 此 nginx 配置中的最佳选择
- php - 处理交易功能贝宝
- sql - 将字符串作为参数插入 NET CORE 中的 where IN 子句
- c# - 操作 MethodInfo 的 DeclaringType - 有可能吗?
- scala - Sbt dist 导致无法访问非托管资源?