ORC是文件未按写入顺序给出记录

时间:2018-08-06 15:31:15

标签: apache-spark apache-spark-sql orc

我最近开始使用ORC文件在磁盘上保留一些记录。我使用保存模式追加将记录批量写入ORC文件中。

但是当从相同的ORC文件中读取记录时,我得到的记录的顺序不同。

以下是我正在使用的一小段代码示例。

要写记录-

private void serializeRowList(List<Object[]> rowsToCache, int chunkNumber) throws Exception
    {
        try
        {
            String orcCompatibleLocalPath = "some_path";    
            sqlContext.createDataFrame(ScalaUtils.convertObjectArrayListToRddOfRows(rowsToCache), schema).write().mode(SaveMode.Append).format("orc").save(orcCompatibleLocalPath);
        }
        catch (Exception e)
        {

        }
    }

我要保存到ORC文件的行是成块的,它们将附加在同一文件中。

现在,我通过以下方式读取同一文件:-

RDD<Row> rows = sqlContext.read().format("orc").load(orcCompatibleLocalPath).rdd();

现在,即使我没有应用任何分区,并且在保存的ORC文件大小比hdfs默认块大小小得多的情况下,我仍在RDD中获得多个分区。

此外,通过使用以下代码获取本地迭代器时-

rowIterator = rdd.toLocalIterator();

我得到的记录的顺序与保存顺序不同。

我需要帮助来确定我在这里做错了。

1 个答案:

答案 0 :(得分:0)

这是正常行为:

  • 通常情况下,Spark不保证特定的订单。
  • Append模式不会附加到文件,而是附加到目录。
  • Spark SQL数据源不再依赖Hadoop配置来确定输入拆分。