3

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

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

再澄清一点,将 Javautil.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>

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

4

3 回答 3

3

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 示例;在摘录下方:

val command = spark.read.format("jdbc").option("url" .... ).load()
command.write.mode("append").format("orc").option("orc.compression","gzip").save("command.orc")
于 2017-12-27T16:58:17.303 回答
2

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

于 2016-08-05T19:01:27.983 回答
2

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

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

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

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

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

好吧,从技术上讲,现在您可以附加到 HDFS 文件;你甚至可以截断它。但是这些技巧只对某些边缘情况有用(例如,Flume 不时将消息以微批量方式输入到 HDFS“日志文件”中fflush)。

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

于 2016-08-05T20:44:01.440 回答