Лучше всего копировать столбцы DataFrame в Python / PySpark? - PullRequest
0 голосов
/ 19 декабря 2018

Это для Python / PySpark с использованием Spark 2.3.2.Я ищу наилучший подход для копирования столбцов одного фрейма данных в другой фрейм данных с использованием Python / PySpark для очень большого набора данных из 10+ миллиардов строк (разделенных по годам / месяцам / дням, равномерно).Каждая строка имеет 120 столбцов для преобразования / копирования.Фрейм выходных данных будет записан с разбивкой по дате в другой набор файлов.

Пример схемы: входной DFinput (colA, colB, colC) и выходной DFoutput (X, Y, Z)

Я хочу скопировать DFInput в DFOutput следующим образом (colA => Z, colB => X, colC => Y).

Что такоелучшая практика, чтобы сделать это в Python Spark 2.3+?Должен ли я использовать DF.withColumn () метод для каждого столбца, чтобы скопировать источник в столбцы назначения?Будет ли это хорошо работать с учетом миллиардов строк, в каждом из которых будет скопировано более 110 столбцов?

Спасибо

Ответы [ 3 ]

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

Этот интересный пример, с которым я столкнулся, показывает два подхода и лучший подход и совпадает с другим ответом.Это Scala, а не pyspark, но применяется тот же принцип, хотя и в другом примере.

import org.apache.spark.sql.functions._
import spark.implicits._

val df = Seq(
             ("1","2", "3"),
             ("4", "5", "6"),
             ("100","101", "102")
            ).toDF("c1", "c2", "c3")

Это дорого, то есть withColumn, которое создает новый DF для каждой итерации:

val df2 = df.columns.foldLeft(df) { case (df, col) =>
          df.withColumn(col, df(col).cast("int"))
          }
//df2.show(false)

Это быстрее.

val df3 = df.select(df.columns.map { col =>
          df(col).cast("int")
          }: _*)
//df3.show(false)
0 голосов
/ 21 декабря 2018

Немного нуб на этом (python), но может быть проще сделать это в SQL (или в каком-либо другом источнике), а затем прочитать его в новый / отдельный фрейм данных?

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

Подход с использованием Apache Spark - насколько я понимаю вашей проблемы - состоит в том, чтобы преобразовать ваш входной DataFrame в желаемый выходной DataFrame.Вы можете просто использовать selectExpr во входном DataFrame для этой задачи:

outputDF = inputDF.selectExpr("colB as X", "colC as Y", "colA as Z")

Это преобразование не будет "копировать" данные из входного DataFrame в выходной DataFrame.

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