Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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_Hadoop_Data Warehouse_Avro_Parquet - Fatal编程技术网

Apache spark 拼花地板格式中的模式演化

Apache spark 拼花地板格式中的模式演化,apache-spark,hadoop,data-warehouse,avro,parquet,Apache Spark,Hadoop,Data Warehouse,Avro,Parquet,目前,我们正在生产中使用Avro数据格式。 在使用Avro的几个优点中,我们知道它在模式演化中很好 现在我们正在评估拼花地板格式,因为它在读取随机列时效率很高。 因此,在继续前进之前,我们的关注点仍然是模式的演变 有人知道拼花地板中的模式演变是否可能,如果是,如何可能,如果否,为什么不可能 有些人声称这是可能的,但它只能在末尾添加列 这意味着什么?模式演化可能(非常)昂贵。 为了找出模式,您基本上必须读取所有拼花地板文件,并在读取期间协调/合并它们的模式,这可能会很昂贵,具体取决于数据集中有多少

目前,我们正在生产中使用Avro数据格式。 在使用Avro的几个优点中,我们知道它在模式演化中很好

现在我们正在评估拼花地板格式,因为它在读取随机列时效率很高。 因此,在继续前进之前,我们的关注点仍然是模式的演变

有人知道拼花地板中的模式演变是否可能,如果是,如何可能,如果否,为什么不可能

有些人声称这是可能的,但它只能在末尾添加列

这意味着什么?

模式演化可能(非常)昂贵。

为了找出模式,您基本上必须读取所有拼花地板文件,并在读取期间协调/合并它们的模式,这可能会很昂贵,具体取决于数据集中有多少文件或/和多少列

因此,由于火花1.5,它们默认关闭。您可以随时将其重新打开)

因为模式合并是一个相对昂贵的操作,并且不是一个简单的过程 在大多数情况下,我们默认从 1.5.0

如果没有模式演化,您可以从一个拼花地板文件中读取模式,并且在读取其余文件时,假定它保持不变

拼花地板模式的演变取决于实现

例如,Hive有一个旋钮
parquet.column.index.access=false
可以设置为按列名而不是按列索引映射架构

然后您也可以删除列,而不仅仅是添加

正如我上面所说的,它依赖于实现,例如,Impala无法正确读取此类拼花地板表(在最近的Impala 2.6版本中已修复)[]

从2.0.2版开始,Apache Spark似乎仍然只支持添加列: []

用户可以从一个简单的模式开始,逐步添加更多的列 根据需要添加到架构。这样,用户可能最终会得到多个 具有不同但相互兼容的模式的拼花文件。这个 拼花地板数据源现在能够自动检测这种情况,并 合并所有这些文件的架构

PS:我看到一些人为了更灵活地更改模式而做的事情是,他们在实际拼花地板表上创建一个视图,将两个(或多个)不同但兼容的模式映射到一个公共模式

假设您在新版本中添加了一个新字段(
registration\u date
),并删除了另一列(
last\u login\u date
),那么这看起来像:

CREATE VIEW datamart.unified_fact_vw
AS
SELECT f1..., NULL as registration_date 
FROM datamart.unified_fact_schema1 f1
UNION ALL
SELECT f2..., NULL as last_login_date
FROM datamart.unified_fact_schema2 f2
;
你有主意了。幸好它在Hadoop方言上的所有sql中都可以使用相同的方式(如我前面提到的Hive、Impala和Spark),并且仍然具有拼花表的所有优点(列存储、谓词下推等)

p.p.S:添加有关Spark可以创建的
通用元数据
摘要文件的信息,以使此答案更加完整

看看SPARK-15719

拼花地板摘要文件现在不是特别有用,因为

 - when schema merging is disabled, we assume 
   schema of all Parquet part-files are identical, 
   thus we can read the footer from any part-files.

- when schema merging is enabled, we need to read footers 
  of all files anyway to do the merge.

On the other hand, writing summary files can be expensive,
because footers of all part-files must be read and merged. 
This is particularly costly when appending a small dataset 
to a large existing Parquet dataset.
因此,有几点反对启用
公共_元数据

  • 当目录由混合了不同模式的拼花文件组成时,_common_元数据允许读者在不读取每个单独文件的模式的情况下为整个目录找出一个合理的模式。由于Hive和Impala可以从Hive元存储访问所述文件的SQL模式,因此它们可以立即开始处理各个文件,并在读取时将每个文件与SQL模式进行匹配,而不是事先探索它们的公共模式。这使得Hive和Impala不需要公共元数据功能

  • 尽管Spark处理拼花地板文件时没有SQL模式(除非使用SparkSQL),因此理论上可以从_common_元数据中获益,但该功能仍然被认为没有用处,因此在Spark-15719中默认禁用

  • 即使这个特性对查询有用,在编写过程中仍然是一个负担。必须维护元数据,这不仅速度慢,而且容易出现竞速条件和其他并发问题,缺乏原子性保证,并且由于元数据陈旧或不一致,很容易导致数据正确性问题

  • 该功能没有文档记录,似乎被视为已弃用(只是“似乎是”,因为它似乎从来没有得到过正式支持,而且不受支持的功能也不能弃用)

  • 来自Cloudera的一位工程师:“我不知道如果存在
    common_metadata
    文件,读取端的行为是否已经改变,以避免查看每个页脚。但无论如何,首先编写该文件是一个巨大的瓶颈,并且给我们的客户带来了很多问题。我强烈建议他们不要费心去尝试生成那个元数据文件。”

  • “_common_metadata”和“_metadata”文件是特定于Spark的,不是由Impala和Hive编写的,例如,可能还有其他引擎


Spark中的摘要元数据文件可能仍然有它的用例-当没有并发性和上面描述的其他问题时-例如,一些流式处理用例-我想这就是为什么这个功能没有从Spark中完全删除的原因。

除了上面的答案之外,还需要设置其他选项

"spark.hadoop.parquet.enable.summary-metadata" to "true"
它的作用:当您编写文件时,它会使用模式创建摘要文件。保存后,您将看到带有
“u元数据”
“u公共”元数据的摘要文件
后缀。
\u公共”元数据是压缩模式,每次读取拼花地板文件时都会读取。这使得读取速度非常快,就像您以前一样ady拥有架构。Spark查找这些架构文件(如果存在)以获取架构

<