spark: dataframe.count 产生的行数比逐行打印或 show() 多

Posted

技术标签:

【中文标题】spark: dataframe.count 产生的行数比逐行打印或 show() 多【英文标题】:spark: dataframe.count yields way more rows than printing line by line or show() 【发布时间】:2016-08-01 19:59:37 【问题描述】:

Spark 新手;使用 Databricks。真的很纳闷。

我有这个数据框:df。

df.count() 产生 Long = 5460

但如果我逐行打印: df.collect.foreach(println) 我只打印了 541 行。同样,df.show(5460) 仅显示 1017 行。可能是什么原因?

一个相关问题:如何使用 Databricks 保存“df”?它保存在哪里? -- 我之前尝试保存,但之后找不到文件。如果相关,我通过安装 S3 存储桶来加载数据。

【问题讨论】:

【参考方案1】:

关于您的第一个问题,Databricks 输出默认截断。这适用于单元格中的文本输出和display() 的输出。我会相信.count()

关于您的第二个问题,您可以在 Databricks 上保存四种类型的位置:

    到使用 df.write.saveAsTable() 的 Hive 管理的表。这些最终将存储在由 Databricks 管理的 S3 存储桶中,该存储桶安装到 /user/hive/warehouse。请注意,您将无权访问 AWS 凭证以使用该存储桶。但是,如果需要,您可以使用 Databricks 文件实用程序 (dbutils.fs.*) 或 Hadoop 文件系统 API 来处理文件。

    本地 SSD 存储。最好使用persist()cache() 完成此操作,但如果您确实需要,您可以使用df.write.save("/dbfs/tmp/...") 写信至/tmp

    您自己的 S3 存储桶,需要挂载。

    /FileStore/,这是您可以直接从集群下载的唯一“目录”。例如,这对于编写要立即导入 Excel 的 CSV 文件很有用。您编写文件并将“下载文件”html 链接输出到您的笔记本中。

更多详情请见Databricks FileSystem Guide。

【讨论】:

【参考方案2】:

差异可能是错误的源数据。 Spark本质上是懒惰的,因此它不会构建一堆列并填充它们只是为了计算行数。因此,当您实际执行数据或行或 null 时,数据可能无法解析。或者您的架构不允许某些列为空,并且在完全解析数据时它们为空。或者您正在修改计数、收集和显示之间的数据。没有足够的细节可以确定。您可以打开一个 spark shell 并创建一小段数据并通过将该数据转换为数据框来测试这些条件。更改架构以允许和不允许空值,或者在源数据中添加空值而不是空值。使源数据字符串,但使架构需要整数。

至于保存您的数据框。您使用 write 创建一个数据框编写器,然后定义要保存的文件类型,然后定义文件名。此示例保存一个 parquet 文件。此处允许的文件类型和写入选项还有许多其他选项。

df.write.parquet("s3://myfile")

【讨论】:

谢谢马克。我认为你对我第二个问题的回答是正确的。对于第一个问题,我仍然不确定。在计数和 println/show 之间我没有采取任何其他操作。数据似乎很好——它打印正常(如果缺少一些行)并保存好。保存的数据实际上确实有 5460 行。 另外,考虑到行数取决于我是否要求 foreach println 或 show,我怀疑这与 Databricks 的某些错误有关,特别是输出单元格的大小。

以上是关于spark: dataframe.count 产生的行数比逐行打印或 show() 多的主要内容,如果未能解决你的问题,请参考以下文章

通过 RESTful API 查询 SPARK 作业产生的数据

Spark history Server产生背景

多列上的 Spark 动态分区覆盖产生空白输出

Spark的wordcount程序产生多少个RDD?

Spark join 产生错误的结果

Spark中的Shuffle过程