Проблема производительности облачного потока данных при записи в BigQuerry - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь прочитать и записать его в BigQuery с облачным потоком данных (Beam Python SDK).На чтение и запись 20 миллионов записей (~ 80 МБ) уходит почти 30 минут.

Глядя на DAG потока данных, я вижу, что преобразование каждой строки CSV в строку BQ занимает большую часть времени.enter image description here

Ниже приведен фрагмент кода для того же:))

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.Все они дают одинаковый результат.Пожалуйста, предложите любую возможную настройку, чтобы сократить время.

Заранее спасибо

1 Ответ

2 голосов
/ 24 сентября 2019

Ваш код требует значительных вычислительных ресурсов, когда вы на него смотрите.Для каждой из ваших 20M строк вы выполняете:

  • A для цикла (сколько элементов в каждой строке?)
  • Зип и перечисление
  • На каждомэлемент в цикле
    • Вы выполняете 2 полосы (которые являются циклом в строке для удаления пробелов)
    • Соединение со слайсом (которые являются 2 циклами) -> как часто это условие выполняется?
    • Другая полоса в другом случае

Python замечательный и очень удобный со многими помощниками.Однако позаботьтесь о ловушке этой легкости и правильно оцените сложность вашего алгоритма.

Если вы знаете Java, попробуйте.Это может быть гораздо эффективнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...