Есть ли способ оптимизировать этот код, который использует панды для чтения TSV-файла, преобразования и записи в таблицу с использованием spark? - PullRequest
0 голосов
/ 15 декабря 2018
    df_pandas = pd.read_csv('filepath/filename' , delimiter='\t' , encoding = 'utf-8', error_bad_lines=False )

    #defining the schema for the spark dataframe
    df_schema_file = StructType([StructField("Col1", StringType(), True),StructField("Col2", StringType(), True)])

    spark_df = spark.createDataFrame(df_pandas,df_schema_file)
    spark_df = spark_df.withColumn("CreatedOn", lit(from_unixtime(unix_timestamp())))
    spark_df = spark_df.withColumn("CreatedOn", spark_df["CreatedOn"].cast(TimestampType()))
    spark_df.write.mode('append').saveAsTable('tbl_name')


    #Creating dataframe from existing table
    spark_df = spark.table('tbl_name')
    df_name = spark_df.toPandas()

Я использую приведенный выше код, чтобы прочитать файл TSV, создать постоянную таблицу с данными в Databricks.Вот почему необходимо преобразовать данные в искровые кадры.Я также должен добавить созданную метку времени в таблицу и указать тип данных метки времени.Я не хочу, чтобы это воспринималось как строка.

Затем мне нужно создать фрейм данных pandas из таблицы, чтобы я мог выполнить некоторые простые преобразования данных.Кадр данных панд должен быть сделан из существующей таблицы.

Прямо сейчас этот фрагмент кода занимает 2,48 минуты для запуска в блоках данных.Это слишком много, так как раньше это выполнялось менее чем за 6 секунд, когда я не использую код для создания нового столбца отметки времени и определения его типа данных.

Есть ли способ оптимизировать этот код?Я не знаю, есть ли какой-либо способ сохранить файл данных pandas напрямую в виде таблицы.Следовательно преобразование в искровые кадры данных.И мне нужно сделать преобразования в самом фрейме данных Pandas.И я не знаю какого-либо метода для создания pandas dataframe из таблицы напрямую.Следовательно, сначала зажечь, а затем панд.

Есть ли способ оптимизировать этот код?

1 Ответ

0 голосов
/ 17 декабря 2018

В Spark есть две концепции, которые вам необходимо понять в первую очередь:

Преобразования - Это означает ленивые операции, которые создают одну или несколько других СДР.Это означает, что на самом деле ничего не выполняется, только запланировано. Ссылка

Действия - которые производят результат, не относящийся к СДР, такой как ваш toPandas(), который фактически выполняет все планирование с преобразованиями. Ссылка

А что касается времени выполнения, у Spark действительно огромные накладные расходы, чтобы начать выполнение любой задачи.Но это дает лучшую производительность, когда это связано с большими задачами.Есть много случаев, когда искра будет медленнее, чем панда или numpy.Но когда вы достигаете конкретного случая огромных данных, выполнение Spark будет быстрее, чем любое локальное выполнение.Если вы работаете с одной машиной с небольшим набором данных, как у вас, панды будут работать быстрее.Spark нужно запустить сессию, найти узлы, сериализовать данные и т. Д. Вот почему у вас есть такие издержки.Продолжайте учиться и попробуйте файлы размером 100 ГБ или более, чтобы увидеть производительность.

...