最近在准备做Databricks相关技术分享时,发现了一个小小的问题,跟同事讨论了一番,算是大概捋清楚了。
问题如下:
在你用Databricks内置display(df)方法预览你的dataframe时或者用SQL做表查询时,如果数据量很大,比如有100w条,它默认不会显示所有数据,都返回浏览器估计也吃不消,这个没问题。问题是到底默认显示多少条数据?根据以往的经验是显示1k或1w条,具体没留意过。今天发现它显示的数据条数居然是不确定的。
首先来看一个例子,加载Databricks默认数据集中的iot device data,只加载一个文件,看看数据量:
df = spark.read.format('json').load('/databricks-datasets/iot-stream/data-device/part-00000.json.gz')display(df)

在返回数据的最下面有显示:8492 rows | Truncated data
也就是显示了8492条数据,也告诉你了,截断了,没显示完。那到底有多少条数据呢?我们来手动count一下:

可以看到,其实总的数据量有5w条。
再来看另外一个数据源的数据量:
another_df = spark.read.format('json').load("/databricks-datasets/structured-streaming/events")display(another_df)

可以看到,这次显示的确实是1w条数据,而且也说了数据truncated了,没显示全。
再来用count看看总数据量:

可以看到,总数据量是10w条。
所以问题就来了,为什么有时候显示默认的1w条,而有时候显示的却小于1w条呢?
根据官网解释:
When a cell is run, table results return a maximum of 10,000 rows or 2 MB, whichever is less.
By default, text results return a maximum of 50,000 characters. With Databricks Runtime 12.1 and above, you can increase this limit by setting the Spark configuration property spark.databricks.driver.maxReplOutputLength.
Source:https://docs.databricks.com/en/notebooks/notebook-outputs.html#show-results
这次明确了:默认最多1w条或者2MB数据。
如果你的数据列数少,都是数字类型的数据,那1w条数据大小应该<2MB,但是如果你的数据有很多列,宽表,某列或某几列包含很多字符串,那1w条数据大小应该很容易超过2MB的限制,所以就根据数据大小2MB这个限制来显示数据条数了。
另外特意看了一下在Databricks SQL Editor中,默认返回1k条数据,如下图所示:

至于那个官网说的:Databricks Runtime 12.1 and above, you can increase this limit by setting the Spark configuration property spark.databricks.driver.maxReplOutputLength.
可以通过设置spark config来增加显示数据量,我简单试了一下,找不到这个参数,等以后用到了再分享吧!
点击关注本公众号,且听下回分享!
原文作者:BPShare;如有侵权,请联系管理员删除。