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

Python 如何使用BigQuery和ApacheBeam将SQL表转换为行序列列表?,python,tensorflow,google-bigquery,google-cloud-dataflow,apache-beam,Python,Tensorflow,Google Bigquery,Google Cloud Dataflow,Apache Beam,我有一个非常大的表,其中每一行表示一个称为Trip的抽象。行程由数字列组成,如车辆id、行程id、开始时间、停止时间、行驶距离、驾驶持续时间等。因此,每次行程都是浮点值的一维向量 我想将这个表或向量列表转换为一个行程序列列表,其中行程按车辆id分组为序列,并根据开始时间排序。序列长度需要限制为特定的大小,例如256,但是可以/应该有多个序列具有相同的VehicleId 示例: (序列长度=4) 我正在尝试使用基于序列的模型(如LSTM/变压器)根据这些行程对驾驶模式进行建模。把每一次旅行想象成一

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

我想将这个表或向量列表转换为一个行程序列列表,其中行程按车辆id分组为序列,并根据开始时间排序。序列长度需要限制为特定的大小,例如256,但是可以/应该有多个序列具有相同的VehicleId

示例:
(序列长度=4)


我正在尝试使用基于序列的模型(如LSTM/变压器)根据这些行程对驾驶模式进行建模。把每一次旅行想象成一个单词,把每一次旅行序列想象成一个句子。不知何故,我需要通过BigQuery/ApacheBeam函数(或任何其他推荐工具)的组合来构造这些句子,因为我们讨论的是数百GB的数据。我对这两种工具都相当陌生,因此非常感谢您的帮助。

以下是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
以上假设按照开始时间和顺序长度对行程进行排序=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, 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
)


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    

下面是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
以上假设按照开始时间和顺序长度对行程进行排序=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, 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
)


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    

我试过了,这正是我需要的,谢谢!只是想知道是否有任何方法也可以根据天数而不是特定的序列长度来设置窗口。ie行程根据时间上不重叠的滑动窗口进行聚合,结果是可变长度的行程序列。确定。我认为这是可行的-请发布带有这些新细节的新问题,以便我或其他人可以回答:o)我尝试过,这正是我需要的,谢谢!只是想知道是否有任何方法也可以根据天数而不是特定的序列长度来设置窗口。ie行程根据时间上不重叠的滑动窗口进行聚合,结果是可变长度的行程序列。确定。我认为这是可行的——请用这些新细节发布新问题,这样我或其他人就可以回答:o)