试图将我的spark scala项目转换为spark-java项目。 我在scala中有如下记录
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class ClassName{
val logger = LoggerFactory.getLogger("ClassName")
...
val dataframe1 = ....///read dataframe from text file.
...
logger.debug("dataframe1.printSchema : \n " + dataframe1.printSchema; //this is working fine.
}
现在我正尝试在Java 1.8中将其编写如下
public class ClassName{
public static final Logger logger = oggerFactory.getLogger("ClassName");
...
Dataset<Row> dataframe1 = ....///read dataframe from text file.
...
logger.debug("dataframe1.printSchema : \n " + dataframe1.printSchema()); //this is not working
}
我尝试了几种方法,但是在调试/信息模式下无法记录printSchema。
dataframe1.printSchema()//实际上返回void,因此无法追加到字符串。
spark-java生产级项目实际上是如何进行日志记录的? 登录调试时需要遵循的最佳方法是什么?
如何处理上述情况?即java中的log.debug(dataframe1.printSchema())吗?
答案 0 :(得分:3)
printSchema
方法已经将模式打印到控制台,而没有以任何形式返回。您可以简单地调用该方法,并将控制台输出重定向到其他位置。还有其他解决方法,例如this one。
答案 1 :(得分:3)
您可以使用df.schema.treeString
。与Void
返回的java中与df.printSchema
等效的Unit()相比,它返回一个字符串。在Scala中是这样,我相信在Java中也是如此。请告诉我是否有帮助。
scala> val df = Seq(1, 2, 3).toDF()
df: org.apache.spark.sql.DataFrame = [value: int]
scala> val x = df.schema.treeString
x: String =
"root
|-- value: integer (nullable = false)
"
scala> val y = df.printSchema
root
|-- value: integer (nullable = false)
y: Unit = ()