当前位置: 首页 > 知识库问答 >
问题:

打印RDD/Dataframe的特定分区

景俊拔
2023-03-14

我一直在试验PySpark RDDs的分区和重新分区。

我注意到,当将一个小样本 RDD 从 2 个分区重新分区到 6 个分区时,只是添加了几个空部分。

rdd = sc.parallelize([1,2,3,43,54,678], 2)  
rdd.glom().collect()  
>>> [[1, 2, 3], [43, 54, 678]]

rdd6 = rdd.repartition(6)
rdd6.glom().collect()
>>> [[], [1, 2, 3], [], [], [], [43, 54, 678]]

现在,我想知道这是否也发生在我的真实数据中。

似乎我不能在较大的数据上使用glom()(带有192497行的df)。
df.rdd.glom().collect()
因为当我尝试时,什么也没发生。不过这是有道理的,由此产生的印刷品将是巨大的......

因此

我想打印每个分区,检查它们是否是空的。或者至少每个分区的前20个元素。

有什么想法吗?

PS:我找到了Spark的解决方案,但我无法让它们在PySpark中工作…
如何在Spark中打印特定RDD分区的元素

顺便说一句:如果有人能向我解释为什么我会首先得到那些空的分区,我会全神贯注…
或者我如何知道什么时候会发生这种情况以及如何避免这种情况
或者,如果数据集中有空分区,它是否不会影响性能?

共有2个答案

经和歌
2023-03-14

关于检查分区是否为空的可能性,我自己遇到了一些解决方案:

  1. (如果没有那么多分区)
rdd.glom().collect()
>>>nothing happens

rdd.glom().collect()[1] 
>>>[1, 2, 3]

不过要小心,它会真正打印整个分区。对于我的数据,它导致了几千行打印。但它奏效了!

来源:如何在Spark中打印特定RDD分区的元素?

l = df.rdd.mapPartitionsWithIndex(lambda x,it: [(x,sum(1 for _ in it))]).collect()

min(l,key=lambda item:item[1])
>>>(2, 61705)

max(l,key=lambda item:item[1])
>>>(0, 65875)

来源:Spark Dataframes:连接后的倾斜分区

卓新知
2023-03-14

显然(令人惊讶),<code>rdd。重新分区仅执行合并,因此,没有混洗,难怪分布不均匀。一种方法是使用dataframe.repartition

rdd = sc.parallelize([1,2,3,43,54,678], 2)  
rdd.glom().collect()  
>>> [[1, 2, 3], [43, 54, 678]]

rdd6 = rdd.repartition(6)
rdd6.glom().collect()
>>> [[], [1, 2, 3], [], [], [], [43, 54, 678]]

rdd6_df = spark.createDataFrame(rdd, T.IntegerType()).repartition(6).rdd
rdd6_df.glom().collect()
[[Row(value=678)],
 [Row(value=3)],
 [Row(value=2)],
 [Row(value=1)],
 [Row(value=43)],
 [Row(value=54)]]
 类似资料:
  • 问题内容: 我正在尝试打印应用程序的特定部分。 该应用程序有一个用户列表,显示他们的名字和姓氏。当我单击用户时,会弹出一个窗口,其中包含有关他们的更多详细信息。 我该如何只为我单击的用户打印弹出窗口?弹出窗口如下所示: 打印按钮仍然无法使用。 问题答案: 您可以使用简单的JavaScript从页面上打印特定的div。

  • 我正在尝试将集合的内容打印到Spark控制台。 我有一个类型: 我使用命令: 但这是打印的: res1:组织。阿帕奇。火花rdd。RDD[单位]=MappedRDD[4]位于map at:19 如何将RDD写入控制台或保存到磁盘,以便查看其内容?

  • 问题内容: 我有一个PDF文档,我想用我的python应用程序打印它。 我在这里尝试了解决方案(使用python的win32print模块打印PDF文档吗?),但是当我安装Ghostscript 9.15(即实际版本)时,它没有 我使用该命令的方式起作用,但是它会打开默认查看器(我的浏览器是Adobe Reader),并且在打印后它仍然保持打开状态,试图通过杀死其他打开的窗口来终止该进程,但我不希

  • 问题内容: Java中有什么方法可以打印到特定的IPP打印机?我发现所有示例代码和教程都集中在如何使用以下类似内容打印特定类型的文档上: 此代码段仅打印到找到的第一台能够打印文档的打印机。就我而言,我想通过其URI查找打印机,但似乎不支持此功能。我尝试使用,而不是,并添加了一个属性,但这不会返回任何打印机。我怀疑查找服务正在寻找可以更改其目标URI的打印机,而不是寻找具有该URI的打印机。 作为最

  • 我有这个JSON: 我想打印键值对,其中键匹配状态和选项,以及时间和它的值。我可以通过使用下面的命令打印时间和所有键值对,但不确定如何提取特定的键值对。 这将产生以下输出: 但我想要的结果是:

  • 我有一个如下数组: 我想做的是找到重复的值,并打印它们。 所以我这样做的方法是转换到,然后转换到,并在上使用。 然后,我使用一个循环通过它,并使用。 这当然会把它们全部打印出来,即使计数是一。 我想加入