簡體   English   中英

Spark Streaming:如何在 Python 中獲取已處理文件的文件名

[英]Spark Streaming: How to get the filename of a processed file in Python

我對 Spark(老實說也是 Python)有點菜鳥,所以如果我錯過了一些明顯的東西,請原諒我。

我正在使用 Spark 和 Python 進行文件流傳輸。 在我做的第一個例子中,Spark 正確地偵聽給定的目錄並計算文件中出現的單詞,所以我知道一切都在偵聽目錄方面起作用。

現在我正在嘗試獲取為審計目的而處理的文件的名稱。 我在這里讀到http://mail-archives.us.apache.org/mod_mbox/spark-user/201504.mbox/%3CCANvfmP8OC9jrpVgWsRWfqjMxeYd6sE6EojfdyFy_GaJ3BO43_A@mail.gmail.com%3E這不是一項瑣碎的任務。 我在這里得到了一個可能的解決方案http://mail-archives.us.apache.org/mod_mbox/spark-user/201502.mbox/%3CCAEgyCiZbnrd6Y_aG0cBRCVC1u37X8FERSEcHB=tR3A2VGrGrPQ@mail.gmail.com%3E我已經嘗試實現它,如下所示:

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()

不幸的是,現在它不是每秒監聽文件夾,而是監聽一次,輸出“無”,然后什么也不做。 這與確實有效的代碼之間的唯一區別是

files = lines.foreachRDD(fileName)

在我什至擔心獲取文件名(明天的問題)之前,有人能明白為什么只檢查一次目錄嗎?

提前致謝

所以這是一個菜鳥錯誤。 我正在發布我的解決方案供我自己和其他人參考。

正如@user3689574 所指出的,我沒有在我的函數中返回調試字符串。 這完全解釋了為什么我得到“無”。

接下來,我在函數外部打印調試,這意味着它永遠不是 foreachRDD 的一部分。 將其移動到函數中,如下所示:

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 pyspark import SparkContext
from pyspark.streaming import StreamingContext

def get_file_info(rdd):
    file_content = rdd.collect()
    file_name = rdd.toDebugString()
    print(file_name, file_content)


def main():
    sc = SparkContext("local[2]", "deneme")
    ssc = StreamingContext(sc, 1)  # One DSTREAM in the same time

    lines = ssc.textFileStream('../urne')
    # here is the call
    lines.foreachRDD(lambda rdd: get_file_info(rdd))

    # Split each line into words
    words = lines.flatMap(lambda line: line.split("\n"))

    # Count each word in each batch
    pairs = words.map(lambda word: (word, 1))

    wordCounts = pairs.reduceByKey(lambda x, y: x + y)

    wordCounts.pprint()

    ssc.start()
   
    ssc.awaitTermination()
   

if __name__ == "__main__":
    main()

然后,當你得到這樣的結果時: b'(3) MapPartitionsRDD[237] at textFileStream at NativeMethodAccessorImpl.java:0 []\\n | UnionRDD[236] at textFileStream at NativeMethodAccessorImpl.java:0 []\\n | file:/some/directory/file0.068513 NewHadoopRDD[231] at textFileStream at NativeMethodAccessorImpl.java:0 []\\n | file:/some/directory/file0.069317 NewHadoopRDD[233] at textFileStream at NativeMethodAccessorImpl.java:0 []\\n | 文件:/some/directory/file0.070036 NewHadoopRDD[235] at textFileStream at NativeMethodAccessorImpl.java:0 []' ['6', '3', '4', '3', '6', '0', “1”、“7”、“10”、“2”、“0”、“0”、“1”、“1”、“10”、“8”、“7”、“7”、“0” ', '8', '8', '9', '7', '2', '9', '1', '5', '8', '9', '9', '0', '6', '0', '4', '3', '4', '8', '5', '8', '10', '5', '2', '3', '6' ', '10', '2', '1', '0', '4', '3', '1', '8', '2', '10', '4', '0', '4', '4', '1', '4', '3', '1', '2', '5', '5', '3', ]

制作一個正則表達式以獲取文件的內容及其名稱,向您標記它有 3 個文件作為一個 DSTREM,因此您可以從那里開始工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM