向ORC文件追加数据

3
我刚开始接触大数据和相关技术,不确定是否可以将数据附加到现有的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>

这些是否正确,有关于此的任何信息吗?

如果您不发布您的代码,我们无法为您提供帮助。 - cheseaux
谢谢您的回复,但我是在一般情况下询问。ORC文件是否支持追加操作?我在任何地方都找不到相关信息。 - rpr
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")

2

如果我理解正确的话,它是用于合并多个文件的,但我想要的是在不创建新文件和合并文件的情况下向现有文件添加数据的选项。 - rpr

2
不,您不能直接将内容追加到ORC文件中。也不能追加到Parquet文件中。任何具有元数据与数据交错的复杂内部结构的列格式都不能进行追加。
引用官方的 "Apache Parquet" 网站...
元数据是在数据之后写入的,以允许进行单次写入。
然后引用官方的 "Apache ORC" 网站...
由于HDFS不支持在写入文件后更改文件中的数据,因此ORC将顶级索引存储在文件末尾(...)。文件的尾部包括3个部分:文件元数据、文件页脚和后置脚本。
好吧,从技术上讲,现在您可以追加到HDFS文件中;甚至可以截断它。但这些技巧只对某些边缘情况有用(例如,使用fflush定期将消息馈送到HDFS“日志文件”中的Flume微批处理)。
针对Hive事务支持,它们使用了一种不同的技巧:在每个事务(即微批处理)中创建一个新的ORC文件,并在后台运行定期压缩作业,类似于HBase。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接