要解释我的问题是不同的:此问题与标记的问题不同。首先,输入参数已经是目录(正确,但是标记的问题是错误的)。其次,我在流式运行期间将txt文件复制到目录中,以模拟新的txt文件到达(因此,将生成新文件,而不是此目录中存在的相同文件)
我的问题在下面
我有一个目录和txt文件/tmp/a.txt
,文件中的内容是
aaa
bbb
我使用pyspark并连续不断地手动将此文件复制到同一目录中(在流式运行的同时创建文件)
def count(x):
if x.isEmpty:
print("empty")
return
print(x.count())
sc = SparkContext()
ssc = StreamingContext(sc, 3)
ssc.textFileStream("/tmp/").foreachRDD(count)
输出显示RDD为空
但是我使用
c = sc.textFile("/tmp/").count()
print(c)
它显示c为2(与txt文件的内容一致)
为什么流媒体不起作用?
答案 0 :(得分:0)
您是要获取附加到/tmp/a.txt
文件的新行还是要获取新文件添加到tmp
目录的文件?
如果是后者,请尝试以此替换您的最后一行
ssc.textFileStream("/tmp/*").foreachRDD(count)
答案 1 :(得分:0)
我在scala中找到了解决方案(仍然无法在python中拾取新文件)
首先,sc.textFile
和sc.textFileStream
具有相同的参数,这是目录名称。所以上面的代码是正确的。
但是,区别在于,如果目录存在({目录必须存在,否则目录sc.textFile
必须存在),InvalidInputException
可以拾取文件,但是以流模式{{1} }(本地文件系统),它要求该目录不存在并由流式程序创建,否则无法拾取新文件(似乎是一个错误,仅存在于本地文件系统中,在HDFS中似乎运行良好根据其他经验)。
此外,从其他一些经验中,他们说如果删除目录并重新运行该程序,则还必须清空回收站。
但是,在python中,此问题仍然存在,并且在目录中不存在文件的情况下,scala程序只会打印sc.textFileStream
,而python程序会发出
0
这是我在python和scala中的代码,编写新文件的方式是相同的,因此我不在此发布
Python代码:
WARN FileInputDStream:87 - Error finding new files
java.lang.NullPointerException
标码:
if __name__ == "__main__":
sc = SparkContext()
ssc = StreamingContext(sc, 3)
ssc.textFileStream(path).foreachRDD(lambda x: print(x.count()))
ssc.start()
ssc.awaitTermination()