【问题标题】:How do I grab a value from a RDD in pyspark?如何从 pyspark 中的 RDD 中获取值?
【发布时间】:2018-02-18 11:18:12
【问题描述】:

我有这个代码:

files = sc.wholeTextFiles ("file:///data/*/*/")

所以,当我运行上面的命令时,我得到了这个:

[('file:/data/file.txt',  'Message')]

如何在 pyspark 中从这个 RDD 中获取“消息”部分而不是文件名?

我有这个代码:

val message = files.map(x = > x._2)

但不起作用。

【问题讨论】:

  • 您尝试的代码看起来像 scala,但您询问的是 python。您的代码的直接翻译将是 message = files.map(lambda x, x[1]) 但这似乎是一个 XY 问题。你想做什么?
  • 没错,这看起来像 scala,但试图获得第二个元组。我不需要文件名,只需要消息。我将如何在 pyspark 中编写 scala 代码?
  • 我编辑了我的原始评论以添加 python 代码。
  • 我得到一个“SyntaxError: invalid syntax”,它指向第一个 [ 在该行。你能帮忙吗?
  • message = files.map(lambda x: x[1])。这行得通!感谢您的帮助!

标签: pyspark


【解决方案1】:

这就是你在 scala 中的做法

rdd = sc.wholeTextFiles("hdfs://nameservice1/user/me/test.txt")
rdd.collect.foreach(t=>println(t._2))

【讨论】:

    【解决方案2】:

    来自pyspark docswholeTextFiles()

    从 HDFS、本地文件系统(在所有节点上可用)或任何 Hadoop 支持的文件系统 URI 读取文本文件目录。每个文件被读取为单个记录并以键值对的形式返回,其中键是每个文件的路径,值是每个文件的内容。

    所以你的代码:

    files = sc.wholeTextFiles ("file:///data/*/*/")
    

    创建一个rdd,其中包含以下形式的记录:

    (file_name,  file_contents)
    

    那么获取文件的内容就只是一个简单的map操作来获取这个元组的第二个元素:

    message = files.map(lambda x: x[1])
    

    message 现在是另一个只包含文件内容的rdd

    有关wholeTextFiles() 及其与textFile() 的不同之处的更多相关信息,请访问this post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2016-05-14
      相关资源
      最近更新 更多