Google cloud dataflow 如何使用beam on cloud数据流在数据管道内迭代日期(天/小时/月)?

Google cloud dataflow 如何使用beam on cloud数据流在数据管道内迭代日期(天/小时/月)?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,问候市民1 我正在尝试使用云数据流将数据从GCS加载到BigQuery 存储桶中的数据存储在以下结构中 “bucket\u name/user\u id/date/date\u hour\u user\u id.csv” 示例“my_bucket/user_1262/2021-01-02/2021-01-02_18_user_id.csv” 如果我有5个用户,例如[“user_1262”、“user_1263”、“user_1264”、“user_1265”、“user_1266”] 我想为所有

问候市民1

我正在尝试使用云数据流将数据从GCS加载到BigQuery

存储桶中的数据存储在以下结构中

“bucket\u name/user\u id/date/date\u hour\u user\u id.csv”

示例“my_bucket/user_1262/2021-01-02/2021-01-02_18_user_id.csv”

如果我有5个用户,例如[“user_1262”、“user_1263”、“user_1264”、“user_1265”、“user_1266”]

我想为所有客户机加载到bq(1小时的数据),例如hour=“18”,在1周的范围内,我想迭代所有客户机

客户端获取前缀为18的文件我已经创建了这段代码,但是迭代会影响数据

管道对于从一个客户机移动到另一个客户机,代码运行一个新的管道

def run(argv=None):

  mydate=['2021-01-02 00:00:00', '2021-01-02 23:00:00'] 
  fmt = '%Y-%m-%d %H:%M:%S'
  hour = dt.timedelta(hours=1)
  day = dt.timedelta(days=1)
  start_time,  end_time = [dt.datetime.strptime(d, fmt) for d in mydate]
  currdate = start_time

  cols = ['cols0','cols1']

  parser = argparse.ArgumentParser(description="User Input Data .")
  args, beam_args = parser.parse_known_args(argv)

  while currdate <= end_time:
  
    str_date = currdate.strftime('%Y-%m-%d')
  
    str_hour = '%02d' % (int(currdate.strftime('%H')))
    
    

    print("********WE ARE PROCESSING FILE ON DATE ---> %s HOUR --> %s" % (str_date, str_hour))
    
    user_list = ["user_1262", "user_1263", "user_1264", "user_1265", "user_1266"]
    
    for user_id in user_list:
      
        file_path_user = "gs://user_id/%s/%s/%s_%s_%s.csv" % (user_id, str_date, str_date, str_hour, user_id)


        with beam.Pipeline(options=PipelineOptions(beam_args)) as p:

            input_data = p | 'ReadUserfile' >> beam.io.ReadFromText(file_path_user_table, columns=cols)
            decode = input_data | 'decodeData' >> beam.ParDo(de_code())
            clean_data = decode | 'clean_dt' >> beam.Filter(clea_data)
            writetobq....
    currdate += day
run()
def运行(argv=None):
mydate=['2021-01-02 00:00:00','2021-01-02 23:00:00']
fmt=“%Y-%m-%d%H:%m:%S”
小时=dt.timedelta(小时=1)
日=dt.timedelta(日=1)
开始时间,结束时间=[mydate中d的dt.datetime.strTime(d,fmt)]
currdate=开始时间
cols=['cols0','cols1']
parser=argparse.ArgumentParser(description=“用户输入数据”)
args,beam_args=parser.parse_known_args(argv)
而currdate>beam.io.ReadFromText(文件路径用户表,列=cols)
decode=input_data |'decodeData'>>beam.ParDo(de_code())
clean_data=decode |“clean_dt”>>beam.Filter(clea_data)
writetobq。。。。
当前日期+=天
运行()

您可以继续在管道创建脚本中生成输入文件列表。但是,您可以将它们放入列表中,而不是为每个输入文件创建新管道。然后让您的管道从读取该列表开始,然后进行转换。这将从您的文件列表中创建一个PCollection,然后开始从该文件列表中读取。

我不完全理解问题所在。您是否正在尝试在一个管道内执行此迭代,而不是为每个迭代创建新管道?是的,每天迭代一次,数据管道分别处理每天的文件。管道是否可以使用多个用户的数据正常运行?例如,如果与每个输入文件的PCollection一起使用,管道是否仍能工作?如果没有,每个管道中还有什么不同?因为目前示例代码只显示输入文件的更改。是的,这就是我所需要的。我只需要更改输入文件和目录,每个目录名都是一个日期,我希望按日期处理数据,所以数据始终按日期分开。明白了。我补充了一个答案,让我知道它是否适合你。