Python 2.7 写入BigQuery时出现云数据流性能问题

Python 2.7 写入BigQuery时出现云数据流性能问题,python-2.7,google-cloud-platform,profiling,google-cloud-dataflow,apache-beam,Python 2.7,Google Cloud Platform,Profiling,Google Cloud Dataflow,Apache Beam,我正在尝试使用云数据流(Beam Python SDK)将其读写到BigQuery 读写2000万条记录(约80Mbs)几乎需要30分钟 查看数据流DAG,我可以看到将每个CSV行转换为BQ行花费了大部分时间 下面是执行相同操作的代码段: beam.Map(lambda s: data_ingestion.parse_record_string(s,data_ingestion.stg_schema_dict)) def parse_record_string(self, stri

我正在尝试使用云数据流(Beam Python SDK)将其读写到BigQuery

读写2000万条记录(约80Mbs)几乎需要30分钟

查看数据流DAG,我可以看到将每个CSV行转换为BQ行花费了大部分时间

下面是执行相同操作的代码段:

beam.Map(lambda s: data_ingestion.parse_record_string(s,data_ingestion.stg_schema_dict)) 

    def parse_record_string(self, string_input,schema_dict): 

        for idx,(x,key) in enumerate(zip(imm_input,schema_dict)):
            key = key.strip()
            datatype = schema_dict[key].strip()
            if key == 'HASH_ID' and datatype != 'STRING':
                hash_id = hash(''.join(imm_input[1:idx]))
                row_dict[key] = hash_id
            else:
                if x:
                    x = x.decode('utf-8').strip()
                    row_dict[key] = x
                else:
                    row_dict[key] = None
                    #row_dict[key] = ''
        return row_dict
除了贴图变换,我还使用了ParDo和Flatmap。所有这些都产生了相同的结果

请建议任何可能的调整以减少时间


提前感谢

当您查看代码时,您的代码是计算密集型的。对于每一条20米长的线路,您执行以下操作:

  • for循环(每行有多少个元素?)
  • 拉链和拉链
  • 在循环中的每个元素上
    • 执行2条带(在字符串上循环以删除空格)
    • 切片上的连接(这是两个循环)->这种情况多久发生一次
    • 另一种情况下的另一条
Python很棒,有很多助手,非常方便。但是,要注意这种容易性的陷阱,并正确评估算法的复杂性


如果你懂Java,试试看。它的效率可能要高得多。

当您查看代码时,它是计算密集型的。对于每一条20米长的线路,您执行以下操作:

  • for循环(每行有多少个元素?)
  • 拉链和拉链
  • 在循环中的每个元素上
    • 执行2条带(在字符串上循环以删除空格)
    • 切片上的连接(这是两个循环)->这种情况多久发生一次
    • 另一种情况下的另一条
Python很棒,有很多助手,非常方便。但是,要注意这种容易性的陷阱,并正确评估算法的复杂性


如果你懂Java,试试看。它可能会更有效率。

FlatMap和Map都有ParDo的支持。Beam在写入BQ时自动将Python dict转换为TableRow。FlatMap和Map都由ParDo支持。Beam在写入BQ时会自动将Python DICT转换为TableRow。完全同意,您可以验证包含内置转换的数据,这些转换可以从Google BigQuery表读取数据,也可以将数据写入Google BigQuery表。完全同意,您可以验证,其中包括可以从Google BigQuery表读取数据和将数据写入Google BigQuery表的内置转换。