当前位置: 首页 > 知识库问答 >
问题:

火花:阿夫罗与镶木地板的表现

公西宏峻
2023-03-14

现在Spark 2.4已经内置了对Avro格式的支持,我正在考虑将数据湖中某些数据集的格式从Parquet更改为Avro,这些数据集通常是针对整行而不是特定列聚合进行查询/联接的。

然而,数据之上的大部分工作都是通过Spark完成的,据我所知,Spark的内存缓存和计算是在列格式的数据上完成的。在这方面,Parquet是否提供了性能提升,而Avro是否会招致某种数据“转换”损失?在这方面,我还需要注意什么?

共有1个答案

邹锦
2023-03-14

这两种格式在不同的约束下大放异彩,但具有具有架构的强类型和共同的二进制编码之类的东西。在其基本形式中,它归结为这种分化:

    < li>Avro是一种行格式。由此可见,您可以逐行追加到现有文件中。然后,这些按行追加的内容也立即对处理这些文件的所有读者可见。当您有一个以流(非批处理)方式写入数据湖的进程时,Avro是最好的。 < li >拼花是一种分栏格式,其文件不可附加。这意味着,对于新到达的记录,您必须始终创建新文件。作为这种行为的交换,拼花地板带来了一些好处。数据以列的方式存储,压缩和编码(简单的类型感知、低cpu但高效的压缩)应用于每一列。因此,拼花文件将比Avro文件小得多。此外,Parquet还写出了基本的统计数据,当您从其中装载数据时,您可以将部分选择下推到I/O,然后只从磁盘装载必要的一组行。因为Parquet已经是柱状的了,而且大多数内存中的结构也是柱状的,所以从它们加载数据通常要快得多。

由于您已经将数据和摄取过程调整为编写Parquet文件,只要数据摄取(延迟)不会成为您的问题,您可能最好使用Parquet。

一个典型的用法实际上是混合使用Parket和Avro。最近、新到达的数据以Avro文件的形式存储,因为这使得数据可以立即进入数据湖。更多的历史数据会被转换,例如每天转换为Parket文件,因为它们更小,加载效率最高,但只能批量写入。在处理这些数据时,您可以将两个表作为两个表的联合加载到Spark中。因此,您可以使用Parket进行高效读取,并使用Avro立即提供数据。这种模式通常被Uber的Hudi或由Netflix开始的Apache Iceberg(孵化)等表格式所隐藏。

 类似资料:
  • 我有一个avro格式的数据流(json编码),需要存储为镶木地板文件。我只能这样做, 把df写成拼花地板。 这里的模式是从json中推断出来的。但是我已经有了avsc文件,我不希望spark从json中推断出模式。 以上述方式,parquet文件将模式信息存储为StructType,而不是avro.record.type。是否也有存储avro模式信息的方法。 火花 - 1.4.1

  • 正在尝试读取avro文件。 无法将运行到Avro架构的数据转换为Spark SQL StructType:[“null”,“string”] 尝试手动创建架构,但现在遇到以下情况: 通用域名格式。databricks。火花阿夫罗。SchemaConverters$CompatibleSchemaException:无法将Avro架构转换为catalyst类型,因为路径处的架构不兼容(avroTyp

  • 我通过两种方法生成拼花地板文件:动弹消防软管和火花作业。它们都被写入S3上相同的分区结构中。两组数据都可以使用相同的Athena表定义进行查询。两者都使用gzip压缩。 然而,我注意到Spark生成的拼花地板文件大约是Firehose生成的拼花地板文件的3倍大。有什么理由会这样吗?在使用Pyarrow加载模式和元数据时,我确实注意到了一些差异: 模式差异可能是罪魁祸首吗?还有别的原因吗? 这两个特

  • 业务案例是,我们希望通过一个列作为分区,将一个大的拼花文件分割成多个小文件。我们已经使用data frame . partition(“XXX”)进行了测试。写(...).用了大约1个小时,记录了10万个条目。因此,我们将使用map reduce在不同的文件夹中生成不同的拼花文件。示例代码: 上面的例子只是生成一个文本文件,如何用multipleoutputformat生成一个parquet文件?

  • 我有一个数据帧,它是由运行特定日期的每日批处理创建的,然后保存在HDFS(Azure Data Lake Gen 2)中。 它是用这样的东西保存的 如您所见,我没有对数据帧进行分区,因为它只包含一个日期。 例如,第一天的第一个文件将存储在文件夹中 交易/2019/08/25 然后第二天,它就会在文件夹里 贸易/2019/08/26 问题是,当所有数据都放好后,日期上的过滤器谓词是否仍会被按下,HD

  • 有没有一种方法可以直接从基于avro模式的parquet文件在Amazon Athena中创建表?模式被编码到文件中,所以我需要自己实际创建DDL看起来很愚蠢。 我看到了这个,还有另一个复制品 但它们与Hive直接相关,这对雅典娜不起作用。理想情况下,我正在寻找一种以编程方式执行此操作的方法,而无需在控制台上定义它。