Apache spark 更新apacheparquet文件中的值

Apache spark 更新apacheparquet文件中的值,apache-spark,parquet,Apache Spark,Parquet,我有一个相当大的拼花文件,需要更改其中一列的值。一种方法是更新源文本文件中的这些值并重新创建拼花地板文件,但我想知道是否有更便宜、更简单的解决方案。让我们从基础开始: 拼花是一种需要保存在文件系统中的文件格式 关键问题: 拼花地板是否支持追加操作 文件系统(即HDFS)是否允许在文件上追加 作业框架(Spark)能否实现追加操作 答复: parquet.hadoop.ParquetFileWriter仅支持CREATE和OVERWRITE;没有append模式。(不确定,但这可能会在其他实现中发

我有一个相当大的拼花文件,需要更改其中一列的值。一种方法是更新源文本文件中的这些值并重新创建拼花地板文件,但我想知道是否有更便宜、更简单的解决方案。

让我们从基础开始:

拼花是一种需要保存在文件系统中的文件格式

关键问题:

  • 拼花地板是否支持追加操作
  • 文件系统(即HDFS)是否允许在文件上追加
    
    
  • 作业框架(Spark)能否实现
    追加
    操作
  • 答复:

  • parquet.hadoop.ParquetFileWriter
    仅支持
    CREATE
    OVERWRITE
    ;没有
    append
    模式。(不确定,但这可能会在其他实现中发生变化——拼花地板设计确实支持
    append

  • HDFS允许使用
    dfs.support.append
    属性对文件执行
    append

  • Spark framework不支持将
  • 附加到现有拼花地板文件中,并且不打算添加

  • 在分布式系统中,附加到现有文件不是一个好主意,特别是考虑到我们可能同时有两个编写器

    详情如下:


      • 您必须重新创建文件,这是Hadoop的方式。尤其是当文件被压缩时


        另一种方法(在大数据中非常常见)是在另一个拼花地板(或ORC)文件上进行更新,然后在查询时加入/联合。

        看看这个不错的博客,它可以回答您的问题,并提供使用Spark(Scala)执行更新的方法:

        从博客复制并粘贴:

        当我们需要在数据结构(拼花地板)中编辑数据时,这些数据是不可变的

        可以将分区添加到拼花地板文件,但不能在位编辑数据

        但最终我们可以对数据进行变异,我们只需要接受这样一个事实:我们不会在适当的地方进行变异。我们需要使用模式和UDF的组合来重新创建拼花地板文件,以更正错误数据

        如果你想在拼花地板中增加数据(你没有问这个问题,但对其他读者来说还是有用的) 请参阅这篇写得很好的博客:


        免责声明:我没有写那些博客,我只是读了一下,发现它可能对其他人有用。

        有一些解决办法,但你需要以某种方式创建拼花地板文件,以便于更新

        最佳做法:

        A.使用行组创建拼花地板文件。在数据压缩和字典编码等功能停止使用之前,您需要优化一个行组中可以包含多少行数据

        B.一次扫描一个行组,找出需要更新的行组。为每个修改的行组生成带有修改数据的新拼花文件。一次处理一行组的数据比处理文件中的所有数据更节省内存

        C.通过附加未修改的行组和通过读取每个行组中的一个拼花文件生成的修改的行组来重建原始拼花文件

        使用行组重新组装拼花地板文件的速度惊人


        从理论上讲,如果您只需删除页脚(统计信息),添加新行组并添加具有更新统计信息的新页脚,那么添加到现有拼花地板文件应该很容易,但没有支持它的API/库。

        否。您必须重新创建该文件。@DanOsipov谢谢。我认为这种限制是由于使用了各种压缩算法,在这些算法中更新列值并不容易,甚至不可能。我想说,这是一个更基本的问题,而不是特定于拼花地板的问题。在大量使用拼花地板的高数据量世界中,不变性是您需要关心的问题。从这个角度来看,您希望加载数据,对其进行转换,然后再次写入。您可能只考虑编写您需要的列,这使得它更高效,因为它是一个柱形格式。我理解您希望更新在上一次运行中已经写入的字段。也许这篇文章能有所帮助。我不推销任何产品。请关注所涉及的概念,而不是广告中的产品。谢谢你的详细回答和背景信息。这是很有帮助的,我知道这个问题比简单地附加分区要复杂一些,正如博文所解释的。假设一个场景,其中一些数据在更多的数据到达之前是有效的,这可以在SQL数据库上轻松实现,但需要创造性,以防您无法仅更新记录的字段,这是拼花文件的情况。