从spark

时间:2018-01-24 12:08:07

标签: apache-spark parquet

从具有多列的拼花文件中只读取spark中的列子集的最有效方法是什么?使用spark.read.format("parquet").load(<parquet>).select(...col1, col2)是最好的方法吗?我也更喜欢使用带有案例类的类型安全数据集来预先定义我的架构,但不确定。

3 个答案:

答案 0 :(得分:7)

val df = spark.read.parquet("fs://path/file.parquet").select(...)

这只会读取相应的列。实际上,实木复合地板是一个柱状存储器,它正是这种用例的意思。尝试运行df.explain并且spark会告诉您只读取相应的列(它会打印执行计划)。如果您还使用where条件,explain还会告诉您哪些过滤器被推送到物理执行计划。最后使用以下代码将数据框(行的数据集)转换为案例类的数据集。

case class MyData...
val ds = df.as[MyData]

答案 1 :(得分:3)

Spark使用Parquet支持下推

load(<parquet>).select(...col1, col2)

很好。

  

我还希望使用带有案例类的类型安全数据集来预先定义我的架构,但不确定。

这可能是一个问题,因为看起来某些优化在这种情况下不起作用Spark 2.0 Dataset vs DataFrame

答案 2 :(得分:1)

Parquet是一种柱状文件格式。它专为这类用例而设计。

val df = spark.read.parquet("<PATH_TO_FILE>").select(...)

应该为你做好工作。