为何Spark中读取Parquet文件未调用Action却生成Job?
为什么Spark读取Parquet时没调用Action却生成了Job?
元数据扫描触发轻量Job:Parquet作为列式存储格式,自带文件级和列级元数据(比如分区信息、列统计、文件脚注)。Spark执行
load时,哪怕只是构建DataFrame,也得先读取这些元数据来确认数据结构。访问存储系统获取元数据的操作会触发一个轻量级Job,这就是你在UI里看到的记录。Schema自动推断的隐式操作:如果没通过
.schema()指定DataFrame的结构,Spark得自动推断Schema。这个过程需要读取部分Parquet文件的内容(通常是第一个文件或采样数据),而读取数据的动作本质就是Action,自然会生成Job。哪怕你只是定义了df变量,没触发计算,Schema推断已经悄悄访问了数据。本地模式的直观表现:如果是在本地模式跑Spark,这类元数据读取或Schema推断的操作会同步执行,所以Job会直接显示在UI里。集群模式下这类操作可能没这么显眼,但本质逻辑是一样的。
可以试试显式指定Schema来验证:
from pyspark.sql.types import StructType, StructField, DoubleType, IntegerType # 提前定义好MTcars的Schema schema = StructType([ StructField("mpg", DoubleType(), True), StructField("cyl", IntegerType(), True), StructField("disp", DoubleType(), True), StructField("hp", IntegerType(), True), StructField("drat", DoubleType(), True), StructField("wt", DoubleType(), True), StructField("qsec", DoubleType(), True), StructField("vs", IntegerType(), True), StructField("am", IntegerType(), True), StructField("gear", IntegerType(), True), StructField("carb", IntegerType(), True) ]) df = spark.read.format("parquet").schema(schema).load("/C:/Users/username/Downloads/MTcars.parquet")
这种情况下Spark不需要推断Schema,也就不会读取实际数据,自然不会生成Job。
内容的提问来源于stack exchange,提问作者Cassius Clay
相关产品推荐
相关产品推荐

