Функциональный способ объединения нескольких фреймов данных - PullRequest
0 голосов
/ 25 октября 2018

Я изучаю Spark в Scala из-за сильного злоупотребления Python и получаю java.lang.NullPointerException, потому что я делаю все по-Питонски.

У меня есть 3 кадра данных формы 4x2 каждый,первый столбец - это всегда индекс 0,1,2,3, а второй столбец - это двоичная функция.Конечная цель - создать фрейм данных 4х4 с объединением всех отдельных.В python я сначала определил бы некоторый master df, а затем перебрал промежуточные, назначив в каждом цикле результирующий объединенный фрейм данных с именем переменной master dataframe (некрасиво):

dataframes = [temp1, temp2, temp3]
df = pd.DataFrame(index=[0,1,2,3]) # Master df
for temp in dataframes:
    df = df.join(temp)

В Spark это не работает хорошо: q = "select * from table" val df = sql(q) Работает очевидно

scala> val df = df.join(sql(q))
<console>:33: error: recursive value df needs type
       val df = df.join(sql(q))

Хорошо, так:

scala> val df:org.apache.spark.sql.DataFrame = df.join(sql(q))
java.lang.NullPointerException
  ... 50 elided

Я думаю, что весьма вероятно, что я не делаю это функциональным образом.Поэтому я попытался (уродливее!):

scala> :paste
// Entering paste mode (ctrl-D to finish)

    sql(q).
      join(sql(q), "device_id").
      join(sql(q), "device_id").
      join(sql(q), "device_id")

    // Exiting paste mode, now interpreting.

    res128: org.apache.spark.sql.DataFrame = [device_id: string, devtype: int ... 3 more fields]

Это выглядит просто уродливо, не элегантно и для новичка.Каким будет правильный функциональный способ Scala для этого?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Еще проще,

val dataframes: Seq[String] = ???
dataframes.reduce(_ join _)
0 голосов
/ 25 октября 2018

foldLeft:

val dataframes: Seq[String] = ???
val df: Dataset[Row] = ???

dataframes.foldLeft(df)((acc, q) => acc.join(sql(q)))

И если вы ищете императивный эквивалент вашего кода Python:

var dataframes: Seq[String] = ???  // IMPORTANT: var
for (q <- dataframes ) { df = df.join(sql(q)) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...