从spark中的镶木地板文件中读取特定列的有效方法
Efficient way to read specific columns from parquet file in spark
从包含许多列的镶木地板文件中仅读取 spark 中列的子集的最有效方法是什么?使用 spark.read.format("parquet").load(<parquet>).select(...col1, col2)
是最好的方法吗?我也更愿意使用带大小写 类 的类型安全数据集来预定义我的模式,但不确定。
Spark 支持 Parquet 下推,因此
load(<parquet>).select(...col1, col2)
没问题。
I would also prefer to use typesafe dataset with case classes to pre-define my schema but not sure.
这可能是个问题,因为看起来某些优化在此上下文中不起作用
val df = spark.read.parquet("fs://path/file.parquet").select(...)
这只会读取相应的列。事实上,parquet 是一种列式存储,它正是为这种类型的用例而设计的。尝试 运行 df.explain
并且 spark 会告诉您只读取相应的列(它会打印执行计划)。 explain
还会告诉您哪些过滤器被下推到物理执行计划,以防您也使用 where 条件。最后使用以下代码将数据框(行数据集)转换为您案例的数据集 class.
case class MyData...
val ds = df.as[MyData]
Parquet 是一种列式文件格式。它正是为这些用例设计的。
val df = spark.read.parquet("<PATH_TO_FILE>").select(...)
应该为您完成这项工作。
至少在某些情况下,获取包含所有列的数据框 + 选择一个子集是行不通的。例如。如果 parquet 包含至少一个类型不受 Spark 支持的字段,则以下操作将失败:
spark.read.format("parquet").load("<path_to_file>").select("col1", "col2")
一种解决方案是提供仅包含请求列的架构 load
:
spark.read.format("parquet").load("<path_to_file>",
schema="col1 bigint, col2 float")
即使无法加载完整文件,您也可以使用它加载 Spark 支持的 parquet 列的子集。我在这里使用 pyspark,但希望 Scala 版本有类似的东西。
从包含许多列的镶木地板文件中仅读取 spark 中列的子集的最有效方法是什么?使用 spark.read.format("parquet").load(<parquet>).select(...col1, col2)
是最好的方法吗?我也更愿意使用带大小写 类 的类型安全数据集来预定义我的模式,但不确定。
Spark 支持 Parquet 下推,因此
load(<parquet>).select(...col1, col2)
没问题。
I would also prefer to use typesafe dataset with case classes to pre-define my schema but not sure.
这可能是个问题,因为看起来某些优化在此上下文中不起作用
val df = spark.read.parquet("fs://path/file.parquet").select(...)
这只会读取相应的列。事实上,parquet 是一种列式存储,它正是为这种类型的用例而设计的。尝试 运行 df.explain
并且 spark 会告诉您只读取相应的列(它会打印执行计划)。 explain
还会告诉您哪些过滤器被下推到物理执行计划,以防您也使用 where 条件。最后使用以下代码将数据框(行数据集)转换为您案例的数据集 class.
case class MyData...
val ds = df.as[MyData]
Parquet 是一种列式文件格式。它正是为这些用例设计的。
val df = spark.read.parquet("<PATH_TO_FILE>").select(...)
应该为您完成这项工作。
至少在某些情况下,获取包含所有列的数据框 + 选择一个子集是行不通的。例如。如果 parquet 包含至少一个类型不受 Spark 支持的字段,则以下操作将失败:
spark.read.format("parquet").load("<path_to_file>").select("col1", "col2")
一种解决方案是提供仅包含请求列的架构 load
:
spark.read.format("parquet").load("<path_to_file>",
schema="col1 bigint, col2 float")
即使无法加载完整文件,您也可以使用它加载 Spark 支持的 parquet 列的子集。我在这里使用 pyspark,但希望 Scala 版本有类似的东西。