Spark Streaming:如何在Python中获取已处理文件的文件名

Spark Streaming:如何在Python中获取已处理文件的文件名,python,spark-streaming,Python,Spark Streaming,我是一个很难激发灵感的人(老实说也是Python),所以如果我错过了一些明显的东西,请原谅我 我正在用Spark和Python做文件流。在我所做的第一个示例中,Spark正确地侦听给定的目录并统计文件中的单词出现次数,因此我知道在侦听该目录时一切都正常 现在,我试图获取为审计目的而处理的文件的名称。我在这里读 这不是一件小事。我这里有一个可能的解决办法 我已尝试按以下方式实施: from __future__ import print_function import sys from pys

我是一个很难激发灵感的人(老实说也是Python),所以如果我错过了一些明显的东西,请原谅我

我正在用Spark和Python做文件流。在我所做的第一个示例中,Spark正确地侦听给定的目录并统计文件中的单词出现次数,因此我知道在侦听该目录时一切都正常

现在,我试图获取为审计目的而处理的文件的名称。我在这里读 这不是一件小事。我这里有一个可能的解决办法 我已尝试按以下方式实施:

from __future__ import print_function

import sys

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

def fileName(data):
    string = data.toDebugString

if __name__ == "__main__":
    sc = SparkContext(appName="PythonStreamingFileNamePrinter")
    ssc = StreamingContext(sc, 1)
    lines = ssc.textFileStream("file:///test/input/")
    files = lines.foreachRDD(fileName)
    print(files)
    ssc.start()
    ssc.awaitTermination()
def fileName(data):
    debug = data.toDebugString()
    print(debug)
(0) MapPartitionsRDD[1] at textFileStream at NativeMethodAccessorImpl.java:-2 [] | UnionRDD[0] at textFileStream at NativeMethodAccessorImpl.java:-2 []
(1) MapPartitionsRDD[42] at textFileStream at NativeMethodAccessorImpl.java:-2 [] | UnionRDD[41] at testFileStream at NativeMethodAccessorImpl.java:-2 [] | file:/test/input/test.txt New HadoopRDD[40] at textFileStream at NativeMethodAccessorImpl.java:-2 []
不幸的是,现在它不是每秒钟监听一次文件夹,而是监听一次,输出“无”,然后等待什么也不做。这与代码之间唯一的区别是

files = lines.foreachRDD(fileName)
在我担心获取文件名(明天的问题)之前,有人知道为什么只检查一次目录吗

提前谢谢
所以这是一个noob错误。我正在发布我的解决方案,供自己和他人参考

正如@user3689574所指出的,我没有在函数中返回调试字符串。这充分解释了为什么我得到了“无”

接下来,我在函数外部打印调试,这意味着它从来都不是foreachRDD的一部分。将其移动到函数中,如下所示:

from __future__ import print_function

import sys

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

def fileName(data):
    string = data.toDebugString

if __name__ == "__main__":
    sc = SparkContext(appName="PythonStreamingFileNamePrinter")
    ssc = StreamingContext(sc, 1)
    lines = ssc.textFileStream("file:///test/input/")
    files = lines.foreachRDD(fileName)
    print(files)
    ssc.start()
    ssc.awaitTermination()
def fileName(data):
    debug = data.toDebugString()
    print(debug)
(0) MapPartitionsRDD[1] at textFileStream at NativeMethodAccessorImpl.java:-2 [] | UnionRDD[0] at textFileStream at NativeMethodAccessorImpl.java:-2 []
(1) MapPartitionsRDD[42] at textFileStream at NativeMethodAccessorImpl.java:-2 [] | UnionRDD[41] at testFileStream at NativeMethodAccessorImpl.java:-2 [] | file:/test/input/test.txt New HadoopRDD[40] at textFileStream at NativeMethodAccessorImpl.java:-2 []
这将按应有的方式打印调试信息,并按应有的方式继续侦听目录。改变它解决了我最初的问题。在获取文件名方面,这已经变得非常简单

目录中没有更改时的调试字符串如下所示:

from __future__ import print_function

import sys

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

def fileName(data):
    string = data.toDebugString

if __name__ == "__main__":
    sc = SparkContext(appName="PythonStreamingFileNamePrinter")
    ssc = StreamingContext(sc, 1)
    lines = ssc.textFileStream("file:///test/input/")
    files = lines.foreachRDD(fileName)
    print(files)
    ssc.start()
    ssc.awaitTermination()
def fileName(data):
    debug = data.toDebugString()
    print(debug)
(0) MapPartitionsRDD[1] at textFileStream at NativeMethodAccessorImpl.java:-2 [] | UnionRDD[0] at textFileStream at NativeMethodAccessorImpl.java:-2 []
(1) MapPartitionsRDD[42] at textFileStream at NativeMethodAccessorImpl.java:-2 [] | UnionRDD[41] at testFileStream at NativeMethodAccessorImpl.java:-2 [] | file:/test/input/test.txt New HadoopRDD[40] at textFileStream at NativeMethodAccessorImpl.java:-2 []
这清楚地表明没有文件。将文件复制到目录中时,调试输出如下所示:

from __future__ import print_function

import sys

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

def fileName(data):
    string = data.toDebugString

if __name__ == "__main__":
    sc = SparkContext(appName="PythonStreamingFileNamePrinter")
    ssc = StreamingContext(sc, 1)
    lines = ssc.textFileStream("file:///test/input/")
    files = lines.foreachRDD(fileName)
    print(files)
    ssc.start()
    ssc.awaitTermination()
def fileName(data):
    debug = data.toDebugString()
    print(debug)
(0) MapPartitionsRDD[1] at textFileStream at NativeMethodAccessorImpl.java:-2 [] | UnionRDD[0] at textFileStream at NativeMethodAccessorImpl.java:-2 []
(1) MapPartitionsRDD[42] at textFileStream at NativeMethodAccessorImpl.java:-2 [] | UnionRDD[41] at testFileStream at NativeMethodAccessorImpl.java:-2 [] | file:/test/input/test.txt New HadoopRDD[40] at textFileStream at NativeMethodAccessorImpl.java:-2 []

使用快速正则表达式,您可以轻松获得文件名。希望这对其他人有所帮助。

您正在将文件添加到目录中吗?因为你的文件名函数没有返回任何内容,所以你没有得到任何结果。。。尝试返回数据。ToDebugstring也不需要foreachRDD,只需在数据流上进行映射,然后进行pprint。@user3689574这两条建议都很有用,谢谢。两者都不能解决我的问题,但我会发布我找到的解决方案。非常感谢:)