BeamSQL Group By 查询问题与 Float 值

BeamSQL Group By query problem with Float value

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

Caused by: org.apache.beam.sdk.coders.Coder$NonDeterministicException: org.apache.beam.sdk.coders.RowCoder@81d6d10 is not deterministic because: All fields must have deterministic encoding. Caused by: org.apache.beam.sdk.coders.Coder$NonDeterministicException: FloatCoder is not deterministic because: Floating point encodings are not guaranteed to be deterministic.

BeamSQL 查询:

PCollection ST= mainColl.apply(SqlTransform.query("SELECT ID,ITEM,UNITPRICE FROM PCOLLECTION GROUP BY ID,ITEM,UNITPRICE"));

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

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

这表明您不应在聚合(分组依据)方案中使用浮点值(在本例中可能是 UNITPRICE 值),因为它们的输出是 non-deterministic(即它可以根据精度变化而变化)。例如,考虑这个例子:

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 保留为 non-grouped 实体(在大多数情况下这是一个合乎逻辑的选项),然后在您的 max(unitprice) as unitpriceavg(unitprice) as unitprice查询,同时按 id, item.
  • 分组

希望对您有所帮助。