2015-04-22 62 views
8

我正在加载高维Parquet文件,但只需要几列。我当前的代码看起来像:如何在Spark中更有效地加载Parquet文件(pySpark v1.2.0)

dat = sqc.parquetFile(path) \ 
      .filter(lambda r: len(r.a)>0) \ 
      .map(lambda r: (r.a, r.b, r.c)) 

我发生了什么事的心理模型是它加载的所有数据,然后扔出去,我不想要的列。我显然更喜欢它甚至没有阅读这些专栏,从我所了解的木地板看来,这似乎是可能的。

因此,有两个问题:

  1. 是我的心智模式错了吗?还是火花编译器足够聪明,只能读取上例中的a,b和c列?
  2. 如何强制sqc.parquetFile()更有效地读取数据?
+0

我觉得你的机会来获得只读需要的列会更高,如果你'map' _before_'filter' – sds

回答

0

Spark总是以懒惰的方式使用本机scala功能来做事。 scala代码已经被编译,它使运行时变得聪明,我的意思是懒惰的决定。使用镶木地板时,应只读取代码引用的必要数据。当然,这取决于特定木地板文件的结构。关键是它会利用列式格式。我对Python不够了解,但它应该能够做同样的事情。也许检查pyspark Row类是否使用某种懒惰的魔法。一种快速验证的方法是进行受控实验,编写另一个引用更多字段的rdd操作,但不输出它们。然后,您可以比较两次操作之间的挂钟时间差异。根据底层parquet文件的一些相关细节,您可能看不到延迟加载的差异。

相关问题