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

Copy from Oracle to Vertica via CSV: lost rows

我尝试通过 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)

编写此脚本以将 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()

精细操作后出现问题 来自甲骨文 卸载 40 000 行 但是在 Vertica 中有 39700 行。

哪里会出现问题,如何解决?

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

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

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

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

您可能想要限制允许的拒绝行数。使用 REJECTMAX 设置一个阈值,超过该阈值您希望 COPY 回滚加载过程。

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

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

Vertica 建议将被拒绝的数据保存到一个 table 中,它将在一个位置同时包含被拒绝的数据和异常。将拒绝的数据保存到 table 很简单,使用 COPY 语句

中的 REJECTED DATA AS TABLE reject_table 子句