如何解决Pyspark Streaming - Windows 行为与 Linux 缺失行
所以我正在读取一个充满 csv 文件的目录,这些文件使用 Pyspark readStream() 和 maxFilesPerTrigger=1 按日期排序。在 Windows 上,它从 最早 2010-12-01.csv 文件开始,并按顺序向前处理。我将行附加到控制台并指定水印。 2010-12-01.csv => 2010-12-02.csv => 2010-12-03.csv ...
(Windows)
streaming = spark.readStream.format("csv").schema(staticSchema)\
.option("maxFilesPerTrigger",1)\
.load("D:\\data\\*.csv")
(Linux)
streaming = spark.readStream.format("csv").schema(staticSchema)\
.option("maxFilesPerTrigger",1)\
.load("file:///opt/data/*.csv")
(Same on both)
stream = streaming.selectExpr("car","cost","timestamp")\
.withWatermark("timestamp","30 seconds")\
.groupBy(F.col("car"),F.window("timestamp","1 hour").alias("tmst_window"))\
.agg(F.sum("cost").alias("agg_cost"))
stream.writeStream.format("console")\
.queryName("customer_purchases")\
.option('truncate',False)\
.outputMode("append").start()
现在,当我在 Linux 上运行完全相同的代码时,它会从一组 csv 文件中随机读取,而不是像 Windows 那样从一开始就开始。我在 Linux 上遇到的一个问题是,它在前几分钟内读取了最后一个文件(2011-12-10.csv,+1 年差异),然后停止处理其余文件。它认为它完成了,也许是因为其余文件在它使用水印处理的文件日期“后面”并停止。在 Windows 上,我得到了数千行,在 Linux 上我只得到了 41 行。在 Windows 和 Linux 上连续运行时,行为保持不变。有人知道为什么会出现这种行为吗?
两者都是独立实例:
Linux:PySpark 2.4.0.16 版(datastax docker 镜像)
Windows:spark-3.1.1-bin-hadoop3.2
解决方法
只是想关闭它,以防有人遇到同样的问题。我在 Databricks 云上重新创建了数据集,并使用了另一个仅安装了 Pyspark 的 docker 镜像。以上两个都给了我与我的 Windows Pyspark 行为相同的结果。所以四个中的三个正常工作。话虽如此,我将远离 Datastax DSE docker 映像,因为它无法正常工作。使用自己的专有文件系统的 Datastax 图像可能存在问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。