В настоящее время нет способа сделать это, кроме как путем предоставления «средства доступа», то есть фрагмента кода в пакете 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 наконец его поддержит), потому что Java9+ обеспечивает более строгие границы модуля, чем Java 8 и старше.В этом случае, вероятно, потребуется доступ к этому API с использованием отражения.
В качестве примечания, я был очень удивлен, когда узнал, что общедоступный API Spark не обеспечивает вывод show()
в строку.Я не вижу разумной причины для этого, и это доставляет много неудобств, например, если вы хотите напечатать фрейм данных с помощью регистратора SLF4J.