2016-08-05 95 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")