通过CSV从Oracle复制到Vertica:丢失行

时间:2017-08-22 17:49:40

标签: python csv vertica

我尝试通过CSV文件将数据从Oracle加载到Vertica

二手python,

编写了这个脚本,用于从Oracle创建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)

将此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()

经过精细化操作后,我遇到了问题 来自oracle 卸载了40 000行 但是在Vertica 39700行中。

哪里可能有问题以及如何解决?

1 个答案:

答案 0 :(得分:0)

COPY语句有两个主要阶段:解析和加载(还有其他阶段,但我们会坚持这两个阶段)。 COPY仅在解析器阶段遇到问题时拒绝数据。那是你最终被拒绝的数据。

解析错误的潜在原因包括:

  • 不支持的解析器选项
  • 正在加载数据的表的数据类型不正确
  • 正在使用的解析器格式错误的上下文
  • 缺少分隔符

如果一行被拒绝,您可能希望整个加载失败,为此,使用可选参数ABORT ON ERROR

您可能希望限制您允许的被拒绝行数。使用REJECTMAX设置阈值,之后您希望COPY回滚加载过程。

Vertica为您提供了保存被拒绝数据的选项:

  • 什么都不做。 Vertica自动保存被拒绝的数据文件和 随附解释每个被拒绝的行(例外),到 名为CopyErrorLogs的目录子目录中的文件。
  • 使用REJECTED DATA和
    指定您选择的文件位置 EXCEPTIONS参数(文件将保存在您运行脚本的机器上)。
  • 将拒绝的数据保存到表格中。使用表格可以查询内容 数据被拒绝,为什么。然后,您可以修复任何不正确的数据,并且 重装。

Vertica建议将被拒绝的数据保存到一个表中,该表将在一个位置包含被拒绝的数据和异常。使用COPY语句中的REJECTED DATA AS TABLE reject_table子句将保留被拒绝的数据保存到表中很简单