BeamSQL Group By проблема запроса со значением Float - PullRequest
1 голос
/ 29 мая 2019

Пытался получить уникальное значение из таблицы BigQuery, используя BeamSQL в Google Dataflow.С помощью предложения Group By реализовано условие в BeamSQL (пример запроса ниже).Один из столбцов имеет тип данных с плавающей точкой.При выполнении задания получено меньше исключений,

Причина: 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, ПУНКТ, УНИТПРИЦ ИЗ ГРУППЫ PCOLLECTION ПО ID, ПУНКТ, УНИТЦЕНА»));

Было бы хорошо, если бы кто-нибудь помог мне решить эту проблему.

Обратите внимание: если мы удалим столбец с плавающей точкой, тогда запрос BeamSQL будет работать нормально.

1 Ответ

2 голосов
/ 29 мая 2019

Это указывает на то, что вам не следует использовать значения с плавающей запятой (в данном случае, вероятно, 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.

Надеюсь, это поможет.

...