2017-08-22 56 views
1

我嘗試通過CSV從Oracle數據加載到Vertica的文件從甲骨文到Vertica的複製通過CSV:失落行

使用蟒蛇,

寫這個劇本從甲骨文

csv_file = open("C:\DataBases\csv\%s_%s.csv" % (FILE_NAME, TABLE_NAME), "a", encoding = 'utf-8') 
for row in cursor: 
    count_rows += 1 
result_inside = {} 
row_content = [] 
for col, val in zip(col_names, row): 
    result_inside[col] = val 
row_content.append(result_inside[col]) 
result_select_from_oracle.append(result_inside) 
file.write(json.dumps(result_inside, 
    default = myconverter)) 
writer = csv.writer(csv_file, delimiter = ';', quoting = csv.QUOTE_ALL) 
writer.writerow(row_content) 
創建CSV

寫這個劇本的COPY CSV至Vertica的

connection = vertica_python.connect(* * conn_info) 
cursor = connection.cursor() 
with open("C:\DataBases\csv\%s_%s.csv" % (FILE_NAME, TABLE_NAME), "rb") as fs: 
    record_terminator = '\n') 
" %(SCHEMA_NAME, TABLE_NAME), my_file) 
cursor.copy("COPY %s.%s from stdin PARSER fcsvparser(type='traditional', delimiter=';', record_terminator='\n')" % (SCHEMA_NAME, TABLE_NAME), my_file) 
connection.commit() 
connection.close() 

fineshed操作我有proble後m from oracle 未裝載40 000行 但Vertica 39700行。

哪裏可以有問題以及如何解決?

+1

嘗試指定REJECTED DATA和EXCEPTIONS子句以查看某些記錄是否被拒絕。 另外,你爲什麼使用flex解析器?如果有的話,它很慢。我使用fcsvparser的唯一情況是列順序未知或值包含多行字符串。 – savyuk

+0

如果我想在文件中上傳拒絕的數據和異常,我必須在vertica serter上寫路徑文件,或者我可以通過windows服務器編寫本地路徑,我將嘗試運行腳本?例如FILE_NAME_REJECTED_DATE =「C:\\ DataBases \\ csv \\ rejected_date_%s.csv」%(TABLE_NAME)cursor.copy(「COPY%s。%s FROM stdin DELIMITER as';'rejected data'%s'」 %(SCHEMA_NAME,TABLE_NAME,FILE_NAME_REJECTED_DATE),my_file) –

+0

它將保存執行腳本的文件(在本例中爲本地文件),被拒絕的數據文件將填充未複製的行,異常文件將包含原因 – IddoE

回答

0

COPY語句有兩個主要階段:解析和加載(還有其他階段,但我們會堅持這兩個階段)。只有在解析器階段遇到問題時,COPY纔會拒絕數據。那時候你最終會被拒絕的數據。

用於解析錯誤的潛在原因包括:

  • 不支持的解析器選項
  • 不正確的數據類型到其中數據被裝載
  • 畸形上下文分析器中使用
  • 缺失定界符表

如果只有一行被拒絕,您可能希望整個負載失敗, r,使用可選參數ABORT ON ERROR

您可能想要限制您允許的被拒絕行數。使用REJECTMAX設置一個閾值,之後您希望COPY回滾加載過程。

Vertica的爲您提供這些選項保存拒絕的數據:

  • 什麼也不做。 Vertica自動將被拒絕的數據文件和每個被拒絕行的說明(例外)保存到名爲CopyErrorLogs的目錄子目錄中的 文件。
  • 使用拒絕的數據指定您選擇的文件位置並輸入EXCEPTIONS參數(文件將保存在運行腳本的機器上)。
  • 將被拒絕的數據保存到表中。使用表格可以查詢數據被拒絕的原因以及原因。然後您可以修復任何不正確的數據,然後重新加載它。

Vertica建議將被拒絕的數據保存到一個表格中,該表格將在一個位置包含被拒絕的數據和異常。將被拒絕的數據保存到表中很簡單,在COPY語句中使用REJECTED DATA AS TABLE reject_table子句

+0

返回的異常錯誤的列數!從源文件複製99列,其中包含:FEWER列。但我驗證行沒有拒絕和拒絕行:統計相同的列。還有什麼可以嗎? –

+0

你有包含你的分隔符的值嗎?嘗試更改分隔符 – IddoE