附加到ORC文件

时间:2016-08-05 15:46:03

标签: hadoop hive orc

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

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

还有一点澄清,当将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>

这些是否正确,是否有任何相关信息?

3 个答案:

答案 0 :(得分:2)

是的,通过Hive可以实现这一点,在这种情况下,您可以基本上“连接”#更新的数据。来自hive官方文档https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions#HiveTransactions-WhatisACIDandwhyshouldyouuseit

答案 1 :(得分:2)

不,您不能直接附加到ORC文件。也不是Parquet文件。也不是任何具有复杂内部结构的柱状格式,其中元数据与数据交错。

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

  

在数据之后写入元数据以允许单次写入

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

  

由于 HDFS不支持更改文件中的数据   写入,ORC将顶级索引存储在文件(...)的末尾   文件的尾部由3部分组成;文件元数据,文件页脚   和后记。

从技术上讲,现在你可以附加到HDFS文件;你甚至可以截断它。但这些技巧仅对某些边缘情况有用(例如,Flume将消息传送到HDFS“日志文件”,微批量,不时fflush

对于Hive事务支持,他们使用不同的技巧:在每个事务(即微批处理)上创建一个新的ORC文件,并在后台运行定期压缩作业,àla HBase。

答案 2 :(得分:2)

2017年更新

是的,你现在可以! Hive为ACID提供了新的支持,但您可以使用附加模式mode("append")Spark

将数据附加到您的表中

下面是一个例子

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;提取物下方:

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