2016-08-05 103 views
2

我是新来的大数据和相关技术,所以我不确定我们是否可以将数据追加到现有的ORC文件。我正在使用Java API编写ORC文件,当我关闭Writer时,我无法再次打开文件以向其写入新内容,基本上是为了添加新数据。附加到ORC文件

有没有一种方法可以将数据附加到现有的ORC文件,使用Java Api或Hive或任何其他方式?

一个更澄清,节省的Java util.Date对象到ORC文件时,ORC类型存储为:

struct<timestamp:struct<fasttime:bigint,cdate:struct<cachedyear:int,cachedfixeddatejan1:bigint,cachedfixeddatenextjan1:bigint>>, 

和Java的BigDecimal是:

<margin:struct<intval:struct<signum:int,mag:struct<>,bitcount:int,bitlength:int,lowestsetbit:int,firstnonzerointnum:int> 

难道这些正确的,没有任何这方面的信息?

+0

如果您不发布您的代码,我们不能帮助您 – cheseaux

+0

感谢您的回应,但我一般会问。 ORC文件是否支持附加操作。我无法在任何地方找到相关信息。 – rpr

回答

1

不,您不能直接附加到ORC文件。也不适用于Parquet文件。也不适用于具有复杂内部结构且元数据与数据交错的列式格式。

引述官方“Apache Parquet”网站...

元数据后的数据写入到允许单次写入

然后引述官方“Apache ORC”网站...

由于它 在书面,ORC存储顶级索引后HDFS不支持在文件中改变数据文件末尾(...) 该文件尾部由3部分组成;文件元数据,文件页脚 和postscript。

那么,在技术上,现在你可以追加到HDFS文件;你甚至可以截断它。但是这些技巧只对某些边缘情况有用(例如Flume将消息馈送到HDFS“日志文件”,微分批处理,不时有fflush)。

对于蜂巢事务支持他们使用不同的技巧:创建与在后台运行的周期性压实作业,点菜 HBase的每次交易一个新的ORC文件(即微批次)。

2

是的,这可以通过Hive来实现,它可以基本'连接'更新的数据。从蜂巢官方文档https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions#HiveTransactions-WhatisACIDandwhyshouldyouuseit

+0

如果我理解正确,它会合并多个文件,但是我正在寻找的是将数据添加到现有文件而不创建新文件并将其合并的选项。 – rpr

+0

嘿抱歉,我有点复制错误的网址。为了让你开心,请找到有关Hive ORC ACID支持的链接。它目前仅适用于ORC。 – abhiieor

1

更新2017年

是现在你可以!蜂巢为ACID新的支持,但你可以Spark

将数据追加到使用附加模式mode("append")表格下面的例子

Seq((10, 20)).toDF("a", "b").write.mode("overwrite").saveAsTable("tab1") 
Seq((20, 30)).toDF("a", "b").write.mode("append").saveAsTable("tab1") 
sql("select * from tab1").show 

或用ORC here更完整exmple;下面摘录:

val command = spark.read.format("jdbc").option("url" ....).load() 
command.write.mode("append").format("orc").option("orc.compression","gzip").save("command.orc")