gpt4 book ai didi

java - Spark : show dataframe content in logging (Java)

转载 作者:行者123 更新时间:2023-12-02 00:39:30 24 4
gpt4 key购买 nike

我想知道如何在 Java 中显示数据框内容(行)?我尝试使用 log.info(df.showString()) ,但它打印出不可读的字符。我想使用 df.collectAsList() ,但之后我必须进行过滤,所以我不能这样做。

谢谢。

最佳答案

有多种记录数据的选项:

将数据收集到驱动程序

您可以调用collectAsList()并随后继续处理。 Spark 数据集是不可变的,因此将它们收集到驱动程序将触发执行,但您可以在之后重新使用数据集进行进一步的处理步骤:

Dataset<Data> ds = ... //1
List<Data> collectedDs = ds.collectAsList(); //2
doSomeLogging(collectedDs);
ds = ds.filter(<filter condition>); //3
ds.show();

上面的代码将收集 //2 行中的数据,记录下来,然后在 //3 行中继续处理。

根据 //1 行中创建数据集的复杂程度,您可能需要缓存数据集,以便 //1 行中的处理仅运行一次。

Dataset<Data> ds = ... //1
ds = ds.cache();
List<Data> collectedDs = ds.collectAsList(); //2
....

使用 map

调用collectAsList()会将所有数据发送到驱动程序。通常,您使用 Spark 来将数据分布到多个执行器节点上,因此您的驱动程序可能不够大,无法同时容纳所有数据。在这种情况下,您可以在 map 调用中记录数据:

Dataset<Data> ds = ... //1
ds = ds.map(d -> {
System.out.println(d); //2
return d; //3
}, Encoders.bean(Data.class));
ds = ds.filter(<filter condition>);
ds.show();

在此示例中,第 //2 行执行日志记录,第 //3 行仅返回原始对象,因此数据集保持不变。我假设 Data 类带有一个可读的 toString() 实现。否则,//2 行需要更多逻辑。它总是对日志库(如 log4j )有帮助,而不是直接写入标准输出。

在第二种方法中,日志不会写入驱动程序,而是写入每个执行程序。您必须在 Spark 作业完成后收集日志并将它们合并到一个文件中。

<小时/>

如果您有一个非类型化数据框而不是上面的数据集,则相同的代码将起作用。您只需直接在Row上进行操作即可。使用 getXXX 方法而不是 Data 类创建日志输出的对象。

所有日志记录操作都会对代码的性能产生影响。

关于java - Spark : show dataframe content in logging (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57954199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com