Google cloud dataflow 如何在Apache beam中基于单个键在多个列上应用聚合函数?

Google cloud dataflow 如何在Apache beam中基于单个键在多个列上应用聚合函数?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我正在使用ApacheBeamPythonSDK并处理GCP数据流。如何基于单个键在多个列上应用聚合函数? 例如,一个包含10列的数据集,其中我的数据看起来像 用户id、产品id、年份、数量、价格,。。。 101,1,2018,10,15,... 101,2,2019,1,10,... 102,1,2019,2,16,... 对于每个用户id,我如何计算他购买的不同产品的数量、最大(数量)、最小(价格)等 我已经看到了wordcount等的例子,您可以对(键,值)对中的值应用sum。如果我想

我正在使用ApacheBeamPythonSDK并处理GCP数据流。如何基于单个键在多个列上应用聚合函数? 例如,一个包含10列的数据集,其中我的数据看起来像

用户id、产品id、年份、数量、价格,。。。
101,1,2018,10,15,...
101,2,2019,1,10,...
102,1,2019,2,16,...

对于每个用户id,我如何计算他购买的不同产品的数量、最大(数量)、最小(价格)等


我已经看到了wordcount等的例子,您可以对(键,值)对中的值应用sum。如果我想在不同的列上做不同的转换,比如求和/平均数/计数等等,

< P>梁使用<代码> pCys,这是一个并行的集合,在Python中你可以认为它是(通常)元素列表(通常是元组或DICT)。p> 在您的情况下,它可能是一个“行”列表,因此

  • 提取行的键。如果这是
    User\u id
    ,那么映射类似于此lambda的内容 e、 g
  • x->(x[0],x)

    请注意,x用作k,v对中的值,并且它仍然包含键,但这很好,如果需要,可以删除它并重新打包没有它的值元组。i、 e.返回的这个元组将类似于类型tuple[str,tuple[int,int,int,float,float]],假设这些是正确的用户id、产品id、年份、数量、价格类型

  • 应用窗口
  • 按键分组(在按键分组之前定义窗口非常重要,并且知道窗口仅在按键分组时生效)

  • 使用一些东西来提取您感兴趣的列(元组中的值),应用聚合,并重新打包下游的内容

  • 对单个元组值使用聚合函数似乎有些奇怪,但聚合将映射/应用于窗口中的整个键组

    这个基本示例可以很容易地扩展

    如果您需要做一些简单的事情,只需映射一个函数,如果您需要的不仅仅是简单,您可以创建一个DoFn。这个很简单

    e、 g!警告,未经测试的代码在传输过程中写入

    def多重聚集(元素):
    (键,行)=元素
    返回(键,(最大值(第[3]行)),最小值(第[4]行))
    
    在本例中,我将user_id作为上一步的键,以及max of quantity和min of price,然后将其打包回k,v对的元组中。k,v对是一个元组,它是下游PCollection的一个元素。需要k,v对的主要原因是
    GroupByKey
    之类的东西隐式地使用第一个值作为分组的键。整个元素隐式用作映射到函数的值。这两件事在查看apachebeam示例时并不明显


    您可以重新打包成k,v对以进行进一步的下游处理,也可以放入准备写入的结构中,例如bigquery或bigtable,或者可能是云存储桶中的文件。在任何情况下使用类型提示都是一个好主意

    梁使用<代码> pCys,一个并行的集合,在Python中,你可以认为它是(通常)元素列表(通常是元组或DICT)。p> 在您的情况下,它可能是一个“行”列表,因此

  • 提取行的键。如果这是
    User\u id
    ,那么映射类似于此lambda的内容 e、 g
  • x->(x[0],x)

    请注意,x用作k,v对中的值,并且它仍然包含键,但这很好,如果需要,可以删除它并重新打包没有它的值元组。i、 e.返回的这个元组将类似于类型tuple[str,tuple[int,int,int,float,float]],假设这些是正确的用户id、产品id、年份、数量、价格类型

  • 应用窗口
  • 按键分组(在按键分组之前定义窗口非常重要,并且知道窗口仅在按键分组时生效)

  • 使用一些东西来提取您感兴趣的列(元组中的值),应用聚合,并重新打包下游的内容

  • 对单个元组值使用聚合函数似乎有些奇怪,但聚合将映射/应用于窗口中的整个键组

    这个基本示例可以很容易地扩展

    如果您需要做一些简单的事情,只需映射一个函数,如果您需要的不仅仅是简单,您可以创建一个DoFn。这个很简单

    e、 g!警告,未经测试的代码在传输过程中写入

    def多重聚集(元素):
    (键,行)=元素
    返回(键,(最大值(第[3]行)),最小值(第[4]行))
    
    在本例中,我将user_id作为上一步的键,以及max of quantity和min of price,然后将其打包回k,v对的元组中。k,v对是一个元组,它是下游PCollection的一个元素。需要k,v对的主要原因是
    GroupByKey
    之类的东西隐式地使用第一个值作为分组的键。整个元素隐式用作映射到函数的值。这两件事在查看apachebeam示例时并不明显


    您可以重新打包成k,v对以进行进一步的下游处理,也可以放入准备写入的结构中,例如bigquery或bigtable,或者可能是云存储桶中的文件。在任何情况下使用类型提示都是一个好主意

    第[3]行不包含数量值列表。max(第[3]行)不是计算数量max的正确方法。将这三个元素(101,(12018,10,15)),(101,(22019,1,10))和(102,(12019,2,16))分组,结果是[(101,[(12018,xx,15),(22019,xx,10)],(102,[(12019,xx,16)],其中xx是数量10,1,2row[3]的值,将不包含数量值列表。max(第[3]行)不是计算数量max的正确方法。将这三个元素(101,(12018,10,15)),(101,(22019,1,10))和