我最近开始使用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();
现在我在RDD中得到了多个分区,尽管我没有应用任何分区,并且保存的ORC文件大小远小于hdfs默认块大小。
此外,当使用以下代码获取本地迭代器时-
rowIterator = rdd.toLocalIterator();
我得到的记录的顺序与保存它们的顺序不同。
我需要帮助来确定我在这里做错了什么。
这是正常行为:
- 在一般情况下,Spark不保证特定的订单
Append
模式不追加到文件,而是追加到目录- Spark SQL数据soruces不再依赖Hadoop配置来确定输入拆分