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