试图使用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查询可以正常工作。
答案 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 unitprice
或avg(unitprice) as unitprice
由id, item
。希望这会有所帮助。