社区首页 >问答首页 >如何更快地计算Foundry“最新版本”数据集?

如何更快地计算Foundry“最新版本”数据集?
EN

Stack Overflow用户
提问于 2020-10-20 08:01:50
回答 1查看 386关注 0票数 2

我有一个数据集,它接收对我的数据行的最新编辑,但它只包含最近编辑的版本。(也就是说,它是在update_ts时间戳列上增量的)。

原表:

代码语言:javascript
代码运行次数:0
复制
| primary_key | update_ts |
|-------------|-----------|
| key_1       | 0         |
| key_2       | 0         |
| key_3       | 0         |

表更新后的表:

代码语言:javascript
代码运行次数:0
复制
| primary_key | update_ts |
|-------------|-----------|
| key_1       | 0         |
| key_2       | 0         |
| key_3       | 0         |
| key_1       | 1         |
| key_2       | 1         |
| key_1       | 2         |

在摄入之后,我需要计算所有先前更新的“最新版本”,同时也要考虑到任何新的编辑。

这意味着我每次都要进行增量摄取并运行快照输出。这对于我的构建来说非常慢,因为我已经注意到,每次我想为我的数据计算最新版本时,我都必须查看我的所有输出行。

事务n=1 (快照):

代码语言:javascript
代码运行次数:0
复制
| primary_key | update_ts |
|-------------|-----------|
| key_1       | 0         |
| key_2       | 0         |
| key_3       | 0         |

事务n=2 (附录):

代码语言:javascript
代码运行次数:0
复制
| primary_key | update_ts |
|-------------|-----------|
| key_1       | 1         |
| key_2       | 1         |

如何使这个“最新版本”计算更快?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-20 08:01:50

这是一种从水桶中受益的常见模式。

这样做的要点是:根据primary_key列将输出快照写入存储桶中,在该栏中,对大得多的输出进行洗牌的昂贵步骤将被完全跳过。

这意味着您只需将您的新数据交换到已经包含您以前历史记录的存储桶。

让我们从初始状态开始,在前面计算的“最新”版本上运行,该版本是一个缓慢的快照:

代码语言:javascript
代码运行次数:0
复制
- output: raw_dataset
  input: external_jdbc_system
  hive_partitioning: none
  bucketing: none
  transactions:
    - SNAPSHOT
    - APPEND
    - APPEND
- output: clean_dataset
  input: raw_dataset
  hive_partitioning: none
  bucketing: none
  transactions:
    - SNAPSHOT
    - SNAPSHOT
    - SNAPSHOT

如果我们使用将clean_dataset列上的存储到单独计算以适应我们预期的数据空间的桶数来编写primary_key,那么我们需要以下代码:

代码语言:javascript
代码运行次数:0
复制
from transforms.api import transform, Input, Output
import pyspark.sql.functions as F
from pyspark.sql.functions import row_number
from pyspark.sql.window import Window


@transform(
    my_output=Output("/datasets/clean_dataset"),
    my_input=Input("/datasets/raw_dataset")
)
def my_compute_function(my_input, my_output):

    BUCKET_COUNT = 600
    PRIMARY_KEY = "primary_key"
    ORDER_COL = "update_ts"

    updated_keys = my_input.dataframe("added")
    last_written = my_output.dataframe("current")

    updated_keys.repartition(BUCKET_COUNT, PRIMARY_KEY)

    value_cols = [x for x in last_written.columns if x != PRIMARY_KEY]

    updated_keys = updated_keys.select(
      PRIMARY_KEY,
      *[F.col(x).alias("updated_keys_" + x) for x in value_cols]
    )

    last_written = last_written.select(
      PRIMARY_KEY,
      *[F.col(x).alias("last_written_" + x) for x in value_cols]
    )

    all_rows = updated_keys.join(last_written, PRIMARY_KEY, "fullouter")
    
    latest_df = all_rows.select(
      PRIMARY_KEY,
      *[F.coalesce(
          F.col("updated_keys_" + x),
          F.col("last_written_" + x)
        ).alias(x) for x in value_cols]
    )

    my_output.set_mode("replace")

    return my_output.write_dataframe(
        latest_df,
        bucket_cols=PRIMARY_KEY,
        bucket_count=BUCKET_COUNT,
        sort_by=ORDER_COL
    )

当它运行时,您将在查询计划中注意到,项目在输出上的步骤不再包含exchange,这意味着它不会对数据进行洗牌。您现在看到的唯一交换是在输入上,它需要以与输出格式化完全相同的方式分发更改(这是一个非常快速的操作)。

然后,将此交换保留到fullouter联接步骤中,在该步骤中,join将利用此漏洞并非常快速地运行600个任务。最后,我们通过在相同的列上显式地插入相同数量的桶来维护输出上的格式。

注意:使用这种方法,您在每个桶中的文件大小将随着时间的推移而增长,而不考虑增加桶数以保持良好大小的需要。使用这种技术,您最终会达到一个阈值,即文件大小超过128 to,并且不再高效执行(修复方法是增加BUCKET_COUNT值)。

您的输出现在将如下所示:

代码语言:javascript
代码运行次数:0
复制
- output: raw_dataset
  input: external_jdbc_system
  hive_partitioning: none
  bucketing: none
  transactions:
    - SNAPSHOT
    - APPEND
    - APPEND
- output: clean_dataset
  input: raw_dataset
  hive_partitioning: none
  bucketing: BUCKET_COUNT by PRIMARY_KEY
  transactions:
    - SNAPSHOT
    - SNAPSHOT
    - SNAPSHOT
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64448980

复制
相关文章
JavaScript获取高度和宽度
屏幕分辨率为:screen.width screen.height 屏幕可用大小:screen.availWidth screen.availHeight 网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽(包括边线的宽):document.body.offsetWidth 网页可见区域高(包括边线的宽):document.body.offsetHeight 网页正文全文宽:document.b
苦咖啡
2018/05/07
3.7K0
JavaScript 获取屏幕的高度和宽度
screen.availHeight:显示浏览器的屏幕的可用高度(这个可用高度不包括分配给半永久特性(如屏幕底部的任务栏)的垂直空间。)
aehyok
2018/09/11
7.2K0
JavaScript  获取屏幕的高度和宽度
iframe自适应高度和宽度[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/04
3.8K0
JavaScript、Jquery获取屏幕的宽度和高度
在日常的项目中经常需要获取屏幕的宽度或者高度,简单记录一下: Javascript方法获取: document.body.clientWidth //网页可见区域宽 document.body.clientHeight //网页可见区域高 document.body.offsetWidth //网页可见区域宽(包括边线的宽) document.body.offsetHeight //网页可见区域高(包括边线的高) document.body.scrollWidth //网页正文全文宽 document.b
德顺
2019/11/13
5.3K0
JavaScript 获取图片的宽度和高度的方法
因为加载图片是异步的,在图片的相关数据没有加载完之后,宽高都是默认为0,所以我们要给imgDom增加个onload方法。
李维亮
2021/07/08
2.7K0
对nwpu数据集的宽度和高度进行修改
NWPU VHR-10目标检测数据集中的ground truth,统一为256x256有时候在使用的时候很不方便,因此需要将宽和高指定为真实的宽和高,python的源代码如下,
狼啸风云
2019/06/14
1.7K0
如何在onCreate中获取View的高度和宽度
在开发过程中经常需要获取到View的宽和高,可以通过View.getWidth()和View.getHeight()来得到宽高。然而新手们经常在onCreate方法中直接调用上面两个方法得到的值是0!
阳仔
2019/07/31
5.3K0
iframe自适应高度和宽度_自适应框架
var ifm_content = document.getElementById(“conFrame”);
全栈程序员站长
2022/11/19
2.9K0
js获得浏览器高度和宽度 参数
document.documentElement.clientHeight -->浏览器的高度
botkenni
2019/09/03
6.1K0
OC中获取一串字符串的高度(宽度确定)或宽度(高度确定)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/52937475
用户1451823
2018/09/13
2.6K0
微信小程序-自动适配屏幕高度和宽度
微信小程序里面的height和width有几种单位,分别是 rpx px vh 和 vw。
叉叉敌
2019/08/16
11.9K0
iOS开发小技巧:根据文本,字体,计算UILabel高度及宽度
关于boundingRectWithSize,系统API有几个类的相关方法。搜索官方文档,可见如下:
陈满iOS
2018/09/10
5.4K0
iOS开发小技巧:根据文本,字体,计算UILabel高度及宽度
关于Div的宽度与高度的100%设定
正像你所知道的那样,设置DIV大小的有两个属性width和height,以前在学习DIV每次给DIV设置100%宽度或高度时都很迷惑,不明确这个100%的宽度(高度)到底有多宽有多高?这个100%是从哪里得到的从哪里继承的?今天我们的话题就是有关div高度100%的问题!
bear_fish
2018/09/19
3.9K0
1501 二叉树最大宽度和高度
1501 二叉树最大宽度和高度 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description     给出一个二叉树,输出它的最大宽度和高度。 输入描述 Input Description 第一行一个整数n。 下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号。如果没有某个儿子为空,则为0。 输出描述 Output Description 输出共一行,输出二叉树的最大宽度和高度,用一个空格隔开。 样例
attack
2018/04/12
8620
跨浏览器获取不同环境的window窗口宽度和高度
IE9+、Firefox、Safari、Opera和Chrome均为此提供了4个属性: innerWidth 、 innerHeight 、 outerWidth 和 outerHeight 。
德顺
2019/11/13
2.8K0
ie8和chrome获取上传图片的宽度和高度等尺寸
测试后可用 <html> <head>     <title>测试</title>     <meta charset="utf-8"/>     <link rel="styleshee
汤高
2018/03/28
1.8K0
win10 uwp 获取窗口的坐标和宽度高度 获取可视范围获取当前窗口的坐标和宽度高度获取最前窗口的范围
本文会经常更新,请阅读原文: https://lindexi.gitee.io/post/win10-uwp-%E8%8E%B7%E5%8F%96%E7%AA%97%E5%8F%A3%E7%9A%84%E5%9D%90%E6%A0%87%E5%92%8C%E5%AE%BD%E5%BA%A6%E9%AB%98%E5%BA%A6.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
林德熙
2019/03/13
3.8K0
纯CSS实现移动端常见布局——高度和宽度挂钩的秘密
不踩坑不回头.之前我在一个项目中大量使用css3的calc计算属性.写代码的时候真心不要太爽啊…但是在项目上线之后,才让我崩溃了,原因很简单,在低于安卓4.4的版本的手机上,自带的浏览器是不支持这个属性的.
FungLeo
2022/05/05
1.3K0
纯CSS实现移动端常见布局——高度和宽度挂钩的秘密
overflow和动态计算高度
首先是MDN:https://developer.mozilla.org/zh-CN/docs/Web/CSS/overflow
阿超
2022/08/21
1.4K0
overflow和动态计算高度
C# dotnet 使用 OpenXml 解析 PPT 元素的坐标和宽度高度
在阅读本文之前,我期望你能了解基础的 PPT 解析内容,或看我的入门级博客。本文将告诉大家如何从 PPT 里面解析出通用元素的 x 和 y 的值,以及元素的宽度和高度的值
林德熙
2020/03/20
1.7K0

相似问题

如何计算图像的高度和宽度

31

如何计算图像的比例宽度和高度?

130

Jquery从图像URL计算图像的宽度和高度

30

计算宽度和高度以调整图像大小

63

计算绘制图像的高度和宽度

29
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文