BeamSQL浮点值分组依据查询问题

时间:2019-05-29 13:30:47

标签: google-cloud-dataflow apache-beam beam-sql

试图使用Google Dataflow中的BeamSQL从BigQuery表中获取唯一值。使用Group By子句在BeamSQL中实现了条件(下面的示例查询)。列之一具有浮点数据类型。在执行Job时出现以下异常,

  

由以下原因导致:org.apache.beam.sdk.coders.Coder $ NonDeterministicException:org.apache.beam.sdk.coders.RowCoder@81d6d10不确定,原因是:     所有字段都必须具有确定性编码。   引起原因:org.apache.beam.sdk.coders.Coder $ NonDeterministicException:FloatCoder不确定,因为:     不能保证浮点编码是确定性的。

BeamSQL查询:

  

PCollection ST = mainColl.apply(SqlTransform.query(“从ID,ITEM,UNITPRICE的PCOLLECTION GROUP中选择SELECT ID,ITEM,UNITPRICE”));

如果有人能帮助我解决这个问题,那就太好了。

请注意,如果我们删除浮点列,则BeamSQL查询可以正常工作。

1 个答案:

答案 0 :(得分:1)

这表明您不应该在聚合(分组依据)方案中使用浮点值(在这种情况下,可能是UNITPRICE值),因为它们的输出是不确定的(即,它可以根据精度变化)。例如,考虑以下示例:

WITH
  data AS (
  SELECT 100 AS id, 'abc' as item, 0.3448473362800000001 AS unitprice
  UNION ALL
  SELECT 200 AS id, 'xyz' as item, 0.49300013 AS unitprice
  UNION ALL
  SELECT 500 AS id, 'pqr' as item, 0.67322332200000212 AS unitprice
)
select id, item, unitprice from data
group by id, item, unitprice

输出为:

100 abc 0.34484733628    
200 xyz 0.49300013   
500 pqr 0.6732233220000021

,其中unitprice的值看起来有些不同。

为避免这种情况,您可以选择两条路线:

  • 您可以将单价转换为字符串,然后继续进行分组。查询中的cast(unitprice as string) as unitprice之类的东西。
  • 您可以简单地选择将unitprice保留为未分组的实体(在大多数情况下,这是一个逻辑选择),只需在分组时在查询中进行max(unitprice) as unitpriceavg(unitprice) as unitpriceid, item

希望这会有所帮助。