Есть ли лучший способ отобразить весь Spark SQL DataFrame?

23

Я бы хотел отобразить весь Apache Spark SQL DataFrame с помощью Scala API. Я могу использовать метод show() :

myDataFrame.show(Int.MaxValue)

Есть ли лучший способ отобразить весь DataFrame, чем использовать Int.MaxValue ?

    
задан Yuri Brovman 15.05.2015 в 18:25
источник
  • Попробуйте myDataFrame.show (false). Не уверен, что это то, что вы ищете. –  Pramit 12.09.2016 в 21:52
  • Использовать RDD.toLocalIterator (), как описано в этом сообщении SO: stackoverflow.com/questions/21698443/... –  Mark Rajcok 28.09.2016 в 20:13

6 ответов

40

Как правило, не рекомендуется отображать весь DataFrame в stdout, потому что это означает, что вам нужно вытащить весь DataFrame (все его значения) в драйвер (если DataFrame уже локально, что вы можете проверить с помощью df.isLocal ).

Если вы заранее не знаете, что размер вашего набора данных достаточно мал, поэтому для процесса JVM-драйвера достаточно памяти для размещения всех значений, это небезопасно. Вот почему по умолчанию API-интерфейс DataFrame API show() показывает только первые 20 строк.

Вы можете использовать df.collect , которая возвращает Array[T] , а затем перебирает каждую строку и печатает ее:

df.collect.foreach(println)

, но вы потеряете все форматирование, реализованное в df.showString(numRows: Int) (что show() внутренне использует).

Нет, я думаю, что лучшего способа нет.

    
ответ дан Grega Kešpret 15.05.2015 в 20:47
  • Спасибо за подробный ответ! –  Yuri Brovman 15.05.2015 в 21:49
  • Добро пожаловать :) –  Grega Kešpret 15.05.2015 в 22:18
  • df.toJSON.collect.foreach (println) лучше –  Gaurav Shah 22.11.2016 в 08:28
  • , но не собирает и тянет весь DataFrame к драйверу? –  user2023507 13.12.2016 в 01:34
2

Как и другие, печать всей DF - плохая идея. Тем не менее, вы можете использовать df.rdd.foreachPartition(f) для распечатки разделяемых разделов без наводнения драйвера JVM (y using collect)

    
ответ дан ayan guha 18.05.2015 в 06:44
  • Можете ли вы предоставить примерный код? Не будут ли операторы печати внутри функции f () печатать на рабочем дне рабочих, а не на stdout драйвера / вашей оболочки? См. Также stackoverflow.com/a/28804763/215945 –  Mark Rajcok 27.09.2016 в 22:18
2

В одном из способов используется функция count() , чтобы получить общее количество записей и использовать show(rdd.count()) .

    
ответ дан AkshayK 10.01.2017 в 14:46
1

В java Я пробовал это двумя способами. Это отлично работает для меня:

1.

data.show(SomeNo);

2.

data.foreach(new ForeachFunction<Row>() {
                public void call(Row arg0) throws Exception {
                    System.out.println(arg0);
                }
            });
    
ответ дан Rajeev Rathor 18.10.2016 в 12:51
0

Ничего более сжатого, но если вы хотите избежать Int.MaxValue , тогда вы можете использовать collect и обработать его, или foreach . Но для табличного формата без особого ручного кода show - лучшее, что вы можете сделать.

    
ответ дан Justin Pihony 15.05.2015 в 20:35
-2

Я пробовал show () и, похоже, иногда работает. Но иногда это не работает, просто попробуйте:

println(df.show())
    
ответ дан keypoint 28.09.2015 в 22:58
  • dr.show () возвращает void не String. –  Bradjcox 25.05.2016 в 21:49
  • По умолчанию оно отображает только топ-20 строк –  Karma-yogi 10.07.2017 в 13:47