Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么Apache Spark读取嵌套结构中不必要的拼花地板列?_Apache Spark_Spark Dataframe_Parquet - Fatal编程技术网

Apache spark 为什么Apache Spark读取嵌套结构中不必要的拼花地板列?

Apache spark 为什么Apache Spark读取嵌套结构中不必要的拼花地板列?,apache-spark,spark-dataframe,parquet,Apache Spark,Spark Dataframe,Parquet,我的团队正在构建一个ETL过程,使用Spark将原始分隔文本文件加载到基于拼花地板的“数据湖”中。拼花地板列存储的承诺之一是,查询将只读取必要的“列条纹” 但是我们看到嵌套的模式结构正在读取意外的列 为了演示,下面是一个使用Scala和Spark 2.0.1外壳的POC: // Preliminary setup sc.setLogLevel("INFO") import org.apache.spark.sql.types._ import org.apache.spark.sql._ //

我的团队正在构建一个ETL过程,使用Spark将原始分隔文本文件加载到基于拼花地板的“数据湖”中。拼花地板列存储的承诺之一是,查询将只读取必要的“列条纹”

但是我们看到嵌套的模式结构正在读取意外的列

为了演示,下面是一个使用Scala和Spark 2.0.1外壳的POC:

// Preliminary setup
sc.setLogLevel("INFO")
import org.apache.spark.sql.types._
import org.apache.spark.sql._

// Create a schema with nested complex structures
val schema = StructType(Seq(
    StructField("F1", IntegerType),
    StructField("F2", IntegerType),
    StructField("Orig", StructType(Seq(
        StructField("F1", StringType),
        StructField("F2", StringType))))))

// Create some sample data
val data = spark.createDataFrame(
    sc.parallelize(Seq(
        Row(1, 2, Row("1", "2")),
        Row(3, null, Row("3", "ABC")))),
    schema)

// Save it
data.write.mode(SaveMode.Overwrite).parquet("data.parquet")
然后,我们将文件读回数据框并投影到列的子集:

// Read it back into another DataFrame
val df = spark.read.parquet("data.parquet")

// Select & show a subset of the columns
df.select($"F1", $"Orig.F1").show
运行时,我们会看到预期的输出:

+---+-------+
| F1|Orig_F1|
+---+-------+
|  1|      1|
|  3|      3|
+---+-------+
但是。。。查询计划显示了一个稍微不同的故事:

“优化计划”显示:

“解释”显示:

根据和,复杂嵌套结构的列应独立存储并可独立检索

问题:

  • 这是当前Spark查询引擎的一个限制吗?换句话说,Parquet是否支持以最佳方式执行此查询,但Spark的查询规划器很幼稚
  • 或者,这是当前实木地板实施的限制吗
  • 或者,我没有正确使用Spark API吗
  • 或者,我是否误解了Dremel/拼花地板柱存储的工作原理

  • 可能相关:

    这是目前Spark查询引擎的一个限制,下面是相关的JIRA票证,Spark只处理Parquet中简单类型的谓词下推,而不是嵌套结构类型


    这是Spark查询引擎问题。@LostInOverflow,您知道这是否在Spark问题跟踪程序中吗?根据@julien le dem,似乎拼花地板应该支持这种情况,解决了这个问题。更新。先前的PR未经决议已关闭,新的简化PR已打开。在这里跟踪新的:谓词下推的限制不应该影响投影。问题可能是相关的,但不是相同的。很抱歉,我在回答中使用了谓词一词,但链接的JIRA票证标题是“拼花过滤器下推不处理结构字段”,不确定这是答案,但请看一看。OP没有筛选器,因此谓词下推不应应用。
    val projected = df.select($"F1", $"Orig.F1".as("Orig_F1"))
    projected.queryExecution.optimizedPlan
    // Project [F1#18, Orig#20.F1 AS Orig_F1#116]
    // +- Relation[F1#18,F2#19,Orig#20] parquet
    
    projected.explain
    // == Physical Plan ==
    // *Project [F1#18, Orig#20.F1 AS Orig_F1#116]
    // +- *Scan parquet [F1#18,Orig#20] Format: ParquetFormat, InputPaths: hdfs://sandbox.hortonworks.com:8020/user/stephenp/data.parquet, PartitionFilters: [], PushedFilters: [], ReadSchema: struct<F1:int,Orig:struct<F1:string,F2:string>>
    
    16/10/21 15:13:15 INFO parquet.ParquetReadSupport: Going to read the following fields from the Parquet file:
    
    Parquet form:
    message spark_schema {
      optional int32 F1;
      optional group Orig {
        optional binary F1 (UTF8);
        optional binary F2 (UTF8);
      }
    }
    
    Catalyst form:
    StructType(StructField(F1,IntegerType,true), StructField(Orig,StructType(StructField(F1,StringType,true), StructField(F2,StringType,true)),true))