【问题标题】:Spark streaming in python: bugs in countByValue and countByValueAndWindow?python 中的 Spark 流:countByValue 和 countByValueAndWindow 中的错误?
【发布时间】:2016-03-10 22:26:31
【问题描述】:

我在 Ubuntu 环境中使用 Spark 1.5.2 和 Python 2.7。

根据关于 countByValuecountByValueAndWindow 的文档: Transformations on dstreams
Window operations

countByValue: 当在 K 类型元素的 DStream 上调用时,返回 (K, Long) 对的新 DStream,其中每个键的值是它在源 DStream 的每个 RDD 中的频率.

countByValueAndWindow: 当在 (K, V) 对的 DStream 上调用时,返回 (K, Long) 对的新 DStream,其中每个键的值是其在滑动窗口中的频率。和 reduceByKeyAndWindow 一样,reduce 任务的数量可以通过可选参数进行配置。

所以基本上这两个函数的返回值应该是(K,Long)对的列表,对吧?

然而,当我做一些实验时,返回值竟然是一个整数列表,而不是对!

更重要的是,在 Github 上用于 pySpark 的官方测试代码中: Link1Link2

您可以看到“预期结果”是整数列表!在我看来,它正在计算不同元素的数量并将它们组合在一起。

我以为我误解了文档,直到我在 Github 上看到 scala 的测试代码:Link1Link2

类似的测试用例,但此时的结果是成对序列

总而言之,scala 的文档和测试用例告诉我们结果是成对的。但是python测试用例和我自己的实验表明结果是整数。

我是 PySpark 和火花流的新手。有人可以帮我解释一下这种不一致吗?现在我正在使用 reduceByKey 和 reduceByKeyAndWindow 作为解决方法。

参考资料:

  1. PySpark streaming documentation about countByValue

  2. PySpark streaming documentation about countByVauleAndWindow

  3. Dpark test cases of countByVauleAndWindow

  4. An example using countByValue in PySpark (not streaming)


更新

这个错误计划在 pyspark 2.0.0 中修复

【问题讨论】:

  • 如果你在github上搜索“countByKeyAndWindow”,在python中只能找到一个地方使用了这个功能……不受欢迎还是因为bug?
  • 我已将此作为错误提出:issues.apache.org/jira/browse/SPARK-12353

标签: python apache-spark pyspark spark-streaming


【解决方案1】:

我同意,countByValueAndWindow 有一个错误,它应该按值返回计数,而不仅仅是没有值的计数。 即使您在 Python 中运行与 Scala 版本相同的测试用例 (link),您也可以看到该函数的 pyspark 版本如何只返回计数而不是它们的值(例如,对)

>>> input = [['a'], ['b', 'b'], ['a', 'b']]
>>> from pyspark.streaming import StreamingContext
>>> ssc = StreamingContext(sc, 1)
>>> input = [sc.parallelize(d, 1) for d in input]
>>> input_stream = ssc.queueStream(input)
>>> input_stream2 = input_stream.countByValueAndWindow(2, 1)
>>> def f(rdd):
...     rows = rdd.collect()
...     for r in rows:
...         print r
... 
>>> input_stream2.foreachRDD(f)
>>> 
>>> sc.setCheckpointDir('/home/xxxx/checkpointdir')
>>> ssc.start() 
>>> 1
2
2
2
0

您应该将此作为 Jira (link) 中的错误提出来,这应该很容易修复。我看不出任何人如何以当前形式使用此函数,因为没有键返回的值数字毫无意义。

【讨论】:

  • PySpark 中的 countByValue 和 counByValueAndWindow 的当前版本似乎返回了不同元素的数量,这是一个单一的数字。因此,在您的示例中, countByValue(input) 将返回 2,因为输入中只有 'a' 和 'b' 两个不同的元素。但无论如何,这与文档不一致。我将尝试将此作为 Jira 中的错误提出。谢谢!
  • 如果你提出,我会尝试为它提供补丁。 :-) 抱歉,这是你发现的一个错误,所以我不想夺走“荣耀”或提高它……但如果你不能提高它,请告诉我,我会的。谢谢!
  • 谢谢,会看看并提交补丁。
  • 好吧,@jerryshao 打败了我,已经提供了修复此问题的补丁 github.com/apache/spark/pull/10350
猜你喜欢
  • 1970-01-01
  • 2020-06-28
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2016-06-15
相关资源
最近更新 更多