如何使用BigQuery和Apache Beam将SQL表转换为行序列列表?

我有一个很大的表,其中每一行代表一个称为Trip的抽象。行程由数字列组成,例如车辆ID,行程ID,开始时间,停止时间,行驶距离,行驶持续时间等。因此,每个行程都是浮点值的一维向量。

我想将此表或向量列表转换为Trip序列列表,其中Trips按车辆ID分组为序列,并根据开始时间排序。序列长度必须限制为特定大小,例如256,但可以/应该有多个序列具有相同的VehicleId。

示例:
(序列长度= 4)

[  
(Vehicle1,[Trip1,Trip2,Trip3,Trip4]),(Vehicle1,[Trip5,Trip6,Trip7]),(Vehicle2,Trip4])  
]

我正在尝试使用基于序列的模型(例如LSTM / Transformer)基于这些行程对驾驶模式进行建模。将每个行程想象成单词嵌入,将每个行程序列想象成一个句子。由于我们谈论的是数百GB的数据,因此我需要以某种方式通过BigQuery / Apache Beam函数(或任何其他推荐的工具)的组合来构造这些语句。我对这两种工具都还比较陌生,因此不胜感激。

MaiRongJian 回答:如何使用BigQuery和Apache Beam将SQL表转换为行序列列表?

以下是用于BigQuery标准SQL

#standardSQL
SELECT trip.vehicle_id,ARRAY_AGG(trip ORDER BY trip.start_time) trips
FROM (
  SELECT trip,DIV(ROW_NUMBER() OVER(PARTITION BY vehicle_id ORDER BY start_time) - 1,4) grp   
  FROM `project.dataset.table` trip
)
GROUP BY trip.vehicle_id,grp

以上假设行程按start_time排序,序列长度= 4
另外,它会在数组中返回vehicle_id作为行程信息的一部分-如下例所示

Row vehicle_id  trips.vehicle_id    trips.trip_id   trips.start_time    trips.stop_time  
1   Vehicle1    Vehicle1            Trip1           1                   2    
                Vehicle1            Trip2           2                   3    
                Vehicle1            Trip3           3                   4    
                Vehicle1            Trip4           4                   5    
2   Vehicle1    Vehicle1            Trip5           5                   6    
                Vehicle1            Trip6           6                   6    
                Vehicle1            Trip7           7                   6    
3   Vehicle2    Vehicle2            Trip1           2                   3    
                Vehicle2            Trip2           3                   4    
                Vehicle2            Trip3           4                   5    
                Vehicle2            Trip4           5                   6    

要消除这种情况-请尝试以下

#standardSQL
SELECT vehicle_id,ARRAY( 
    SELECT AS STRUCT * EXCEPT(vehicle_id)
    FROM UNNEST(trips)
    ORDER BY start_time
  ) trips
FROM (
  SELECT trip.vehicle_id,ARRAY_AGG(trip ORDER BY trip.start_time) trips
  FROM (
    SELECT trip,4) grp   
    FROM `project.dataset.table` trip
  )
  GROUP BY trip.vehicle_id,grp
)


Row vehicle_id  trips.trip_id   trips.start_time    trips.stop_time  
1   Vehicle1    Trip1           1                   2    
                Trip2           2                   3    
                Trip3           3                   4    
                Trip4           4                   5    
2   Vehicle1    Trip5           5                   6    
                Trip6           6                   6    
                Trip7           7                   6    
3   Vehicle2    Trip1           2                   3    
                Trip2           3                   4    
                Trip3           4                   5    
                Trip4           5                   6    
本文链接:https://www.f2er.com/3164300.html

大家都在问