我是大数据和相关技术的新手,所以我不确定我们是否可以将数据附加到现有的ORC文件中。我正在使用Java编写ORC文件,当我关闭Writer时,我无法再次打开该文件来向其写入新的内容,基本上可以追加新的数据。
是否可以使用Java或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>这些是正确的吗?有关于这个的任何信息吗?
发布于 2016-08-05 20:44:01
不,您不能直接附加到ORC文件。或者是一个Parquet文件。也不适用于任何具有复杂内部结构和元数据交织的柱状格式。
引用官方的"Apache Parquet“网站..。
元数据是在数据之后写入的,以便允许单程写入。
然后引用官方的"阿帕奇兽人“网站..。
由于HDFS不支持在写入后更改文件中的数据,所以ORC将顶级索引存储在文件的末尾(.)文件的尾部由三个部分组成:文件元数据、文件页脚和postscript。
从技术上讲,现在您可以附加到HDFS文件,甚至可以截断它。但这些技巧仅适用于某些边缘情况(例如,将消息输入到HDFS“日志文件”中,以微批处理的方式进行,并不时使用fflush )。
对于Hive事务支持,他们使用了一种不同的技巧:在每个事务(即微批处理)上创建一个新的ORC文件,并在后台运行周期性的压缩作业(àla HBase )。
发布于 2017-12-27 16:58:17
更新2017年
是的,现在你可以了!Hive为酸提供了新的支持,但您可以使用附加模式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或与兽人这里的一个更完整的例子;下面是一个摘录:
val command = spark.read.format("jdbc").option("url" .... ).load()
command.write.mode("append").format("orc").option("orc.compression","gzip").save("command.orc")发布于 2016-08-05 19:01:27
是的,这是可能的,通过蜂巢,你基本上可以‘连接’较新的数据。来自蜂巢官方文档https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions#HiveTransactions-WhatisACIDandwhyshouldyouuseit
https://stackoverflow.com/questions/38793170
复制相似问题