在Python Spark中查看RDD内容?

  发布于 2022-12-28 13:37

在pyspark中运行一个简单的应用程序.

f = sc.textFile("README.md")
wc = f.flatMap(lambda x: x.split(' ')).map(lambda x: (x, 1)).reduceByKey(add)

我想使用foreach操作查看RDD内容:

wc.foreach(print)

这会引发语法错误:

SyntaxError: invalid syntax

我错过了什么?

4 个回答
  • 此错误是因为print它不是Python 2.6中的函数.

    您可以定义执行打印的帮助程序UDF,也可以使用__future__库print作为函数处理:

    >>> from operator import add
    >>> f = sc.textFile("README.md")
    >>> def g(x):
    ...     print x
    ...
    >>> wc.foreach(g)
    

    要么

    >>> from __future__ import print_function
    >>> wc.foreach(print)
    

    但是,我认为最好使用collect()将RDD内容带回驱动程序,因为foreach在工作节点和输出上的执行可能不一定出现在您的驱动程序/ shell中(它可能在local模式下,但在运行时不会一个集群).

    >>> for x in wc.collect():
    ...     print x
    

    2022-12-28 13:39 回答
  • 在Spark 2.0中(我没有使用早期版本进行测试).只是:

    print myRDD.take(n)
    

    其中n是行数,myRDDwc.

    2022-12-28 13:39 回答
  • 试试这个:

    data = f.flatMap(lambda x: x.split(' '))
    map = data.map(lambda x: (x, 1))
    mapreduce = map.reduceByKey(lambda x,y: x+y)
    result = mapreduce.collect()
    

    请注意,当您运行collect()时,RDD(分布式数据集)将在驱动程序节点聚合,并基本上转换为列表.很明显,收集()2T数据集不是一个好主意.如果您只需要RDD中的几个样本,请使用take(10).

    2022-12-28 13:41 回答
  • 如果你想看到RDD的内容,那么yes collect是一个选项,但是它将所有数据提取给驱动程序,因此可能存在问题

    <rdd.name>.take(<num of elements you want to fetch>)
    

    如果你只想看样品,那就更好了

    运行foreach并尝试打印,我不推荐这个,因为如果你在集群上运行它,那么打印日志将是执行程序的本地日期,它将打印该执行程序可访问的数据.print语句不会改变状态,因此它在逻辑上不是错误的.要获得所有日志,您将不得不做类似的事情

    **Pseudocode**
    collect
    foreach print
    

    但这可能会导致作业失败,因为收集驱动程序上的所有数据可能会导致崩溃.我建议使用take命令,或者如果你想分析它,那么在驱动程序上使用sample collect或写入文件然后进行分析.

    2022-12-28 13:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有