2016-08-01 217 views
1

Spark to new;使用Databricks。真的很迷惑。spark:dataframe.count产生的方式多于逐行打印或show()

我有这个dataFrame:df。

df.count()得到龙= 5460

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

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

回答

1

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

关于你提到的第二个问题,有四种类型的地方,你可以节省Databricks:使用df.write.saveAsTable()

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

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

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

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

详情请参阅Databricks FileSystem Guide

1

区别可能是不良源数据。 Spark本质上是懒惰的,所以它不会构建一堆列并填充它们来计算行数。所以当你实际执行数据或行或空值时,数据可能不会被解析。或者,您的模式不允许某些列的空值,并且在数据完全解析时它们为空。或者您正在修改计数,收集和显示之间的数据。没有足够的细节来确定。您可以打开一个Spark壳并创建一小段数据,并通过将该数据转换为数据帧来测试这些条件。更改模式以允许并且不允许在源数据中允许空值或添加空值而不是空值。使源数据字符串,但使模式需要整数。

至于保存你的数据帧。您使用写入创建数据帧写入器,然后定义要保存的文件类型,然后定义文件名。本例保存一个parquet文件。文件类型和写入选项还有许多其他选项可供选择。

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

谢谢马克。我认为你对我的第二个问题的回答是肯定的。对于第一个问题,我仍然不确定。在count和println/show之间我没有采取其他行动。数据似乎很好 - 它打印确定(如果缺少一些行)并保存OK。保存的数据实际上有5460行。 – MichM

+0

另外,考虑到行数的不同取决于我是否要求使用foreach println或show,我怀疑它与Databricks的一些错误有关,特别是输出单元的大小。 – MichM