Как реализовать динамические входы BigQueryIO - PullRequest
0 голосов
/ 27 января 2019

Я использую Apache Beam в потоке данных Google.

Мой конвейер читает из BigQuery, но это зависит от параметров выполнения.Я должен быть в состоянии запустить конвейер с одной точкой (долгота, широта) и несколькими точками.

Только для одной точки решение является прямым: я могу поставить запрос как ValueProvider.

select * 
from UserProfile 
where id_ in ( select distinct userid 
               from   locations 
               where  ST_DWITHIN(ST_GeogPoint(longitude, latitude),
                                 ST_GeogPoint(10.9765,50.4322),
                                 300)
             )

Проблема в том, что у меня больше 1 балла для выполнения запроса к ним.Я пытался применить считывание BigQuery к каждой точке и объединить результаты в одной PCollection, но я понятия не имею, как передать точки в конвейер и построить его динамически.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Если количество точек не слишком велико (я бы сказал, меньше тысячи), один простой способ выполнить этот запрос - предоставить одну строку с описанием WKT набора точек:

select * 
from UserProfile 
where id_ in ( 
    select distinct userid 
    from   locations 
    where ST_DWITHIN(ST_GeogPoint(longitude, latitude),
                     ST_GeogFromText("MULTIPOINT((10.9765 50.4322), (10 50))"),
                     300)
    )

Строка WKT должна быть легко встроена в ваш код.

Если число интересных точек больше, я бы пошел с таблицей точек и сделал бы JOIN между таблицами локаций и таблицей интересных точек:

select * 
from UserProfile 
where id_ in ( 
    select distinct userid 
    from   locations as l, interesting_points as p
    where ST_DWITHIN(ST_GeogPoint(l.longitude, l.latitude),
                     p.point,
                     300)
    )
0 голосов
/ 27 января 2019

Одним из способов было бы сначала поместить эти географические точки в таблицу (скажем, my_points_table), а затем извлечь их в подзапросе:

select * from UserProfile where id_ in 
   (
     select distinct userid from locations l 
     left outer join my_points_table t on 1=1
     where 
      ST_DWITHIN(
        ST_GeogPoint(l.longitude, l.latitude),
        ST_GeogPoint(t.longitude, t.latitude),
      300)
   )
...