【问题标题】:Can google dataflow convert an input date to a bigquery timestamp谷歌数据流可以将输入日期转换为大查询时间戳吗
【发布时间】:2019-02-05 00:53:20
【问题描述】:

对数据流很陌生,我一直在寻找解决问题的方法。我需要运行一个管道,它以以下格式从 csv 文件中读取日期:2019010420300033,将其传递给不同的流程并最终在 bigquery 中作为时间戳。有没有办法做到这一点,或者输入文件必须首先转换为可转换的日期(我知道这样的格式有效:2019-01-01 20:30:00.331)。 或者,是否有可能以某种方式将数据流输出转换为转换该日期的新管道?

谢谢

【问题讨论】:

    标签: python google-cloud-platform dataflow


    【解决方案1】:

    这对 Dataflow 来说是一项轻松的工作。您可以使用 ParDo 或 Map。

    在下面的示例中,CSV 中的每一行都将传递给 Map(convertDate)。您需要修改函数 convertDate 以适应日期转换,然后返回修改后的行。然后将整个转换后的 CSV 写入输出文件集。

    使用地图的示例(简化):

    def convertDate(line):
        # convert date to desired format
        # Split line into columns, change date format for desired column
        # Rejoin columns into line and return
        cols = line.split(',')  # change for your column seperator
        cols[2] = my_change_method_for_date(cols[2]) # code the date conversion here
        return ",".join(cols)
    
    with beam.Pipeline(argv=pipeline_args) as p:
        lines = p | 'ReadCsvFile' >> beam.io.ReadFromText(args.input)
        lines = lines | 'ConvertDate' >> beam.Map(convertDate)
        lines | 'WriteCsvFile' >> beam.io.WriteToText(args.output)
    

    【讨论】:

    • 谢谢,我一定会试试这个并回复评论!它看起来像我正在寻找的东西。
    • 非常感谢,你是救世主!由于我已经将字段拆分为字典,因此我不得不稍微调整一下。所以我做了一个键值更改,它可以工作 def str2timestamp(s, fmt='%Y%m%d%H%M%S%f'): dt = datetime.strptime(s, fmt) epoch = datetime.utcfromtimestamp (0) return (dt - epoch).total_seconds() line.update({'transaction_date': str2timestamp(line['transaction_date'])})
    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 2022-01-10
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2019-01-18
    相关资源
    最近更新 更多