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

时间:2016-08-01 19:59:38

标签: apache-spark apache-spark-sql spark-dataframe databricks

Spark新手;使用Databricks。真的很困惑。

我有这个dataFrame:df。

df.count()产生长= 5460

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

一个相关问题:如何保存" df"与Databricks?它存放在哪里? - 我之前试图保存,但之后无法找到该文件。我通过安装S3存储桶加载数据,如果相关的话。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

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

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

  3. 您自己的S3存储桶,需要安装。

  4. /FileStore/,这是唯一的"目录"您可以直接从群集下载。例如,这对于立即编写要带入Excel的CSV文件非常有用。您编写文件并输出"下载文件" HTML链接到您的笔记本。

  5. 有关详细信息,请参阅Databricks FileSystem Guide