我对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)
在我担心获取文件名(明天的问题)之前,任何人都可以看到为什么这只是检查目录一次?
提前致谢 中号
答案 0 :(得分:2)
所以这是一个菜鸟错误。我发布了我的解决方案供我自己和他人参考。
正如@ 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 []
使用快速正则表达式,您可以轻松找到文件名。希望这有助于其他人。
答案 1 :(得分:0)
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,因此您可以从那里开始工作