Есть ли способ получить вывод Dataset#show()
в виде строки?
Следующее выводит его на стандартный вывод, но мне интересно, могу ли я получить его как строку и зарегистрировать его несколько лучше:
val foobarData: DataFrame = ...
println("+++ foobarData.show(): +++")
foobarData.show()
В настоящее время нет другого способа сделать это, кроме как предоставить «аксессор», то есть фрагмент кода в пакете 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.