Получение вывода Spark org.apache.spark.sql.Dataset # show () в виде строки?

Есть ли способ получить вывод Dataset#show() в виде строки?

Следующее выводит его на стандартный вывод, но мне интересно, могу ли я получить его как строку и зарегистрировать его несколько лучше:

val foobarData: DataFrame = ...

println("+++ foobarData.show(): +++") 
foobarData.show()
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
115
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В настоящее время нет другого способа сделать это, кроме как предоставить «аксессор», то есть фрагмент кода в пакете org.apache.spark.sql, который будет использовать частный API пакета:

package org.apache.spark.sql

object ShowAccessor {
  def show(ds: Dataset[_]): String = ds.showString(20)
}

Вы можете указать другой набор параметров (в showString есть еще два параметра со значениями по умолчанию), но общая идея остается той же.

В качестве альтернативы вы можете сделать это с отражением, но для этого потребуется больше кода (особенно с отражением Scala), поэтому я лично предпочитаю подход аксессоров.

К сожалению, этот подход, вероятно, не будет работать с Java 9+ (конечно, как только Spark наконец его поддержит), потому что Java 9+ устанавливает границы модулей гораздо более строго, чем Java 8 и старше. В этом случае, вероятно, потребуется доступ к этому API с помощью отражения.

Кстати, я был очень удивлен, когда обнаружил, что общедоступный Spark API не обеспечивает вывод show() в строку. Я не вижу разумной причины для этого, и это доставляет массу неудобств, если вы, например, захотите распечатайте фрейм данных, используя регистратор SLF4J.

Другие вопросы по теме