【问题标题】:How to use Vertica's COPY LOCAL as an sql statement from MATLAB on Windows如何在 Windows 上使用 Vertica 的 COPY LOCAL 作为 MATLAB 的 sql 语句
【发布时间】:2016-03-25 09:59:21
【问题描述】:

我正在尝试将使用 MATLAB 创建的大约 8000 万条记录插入到 Vertica 数据库表中。我想知道我们是否可以在 MATLAB 中调用 COPY LOCAL 语句作为使用 exec(conn, sql) 的常规 sql 语句。出于测试目的,我尝试了一个包含大约 400 万条记录的 dat 文件,如下所示:

sqlstmnt = 'COPY schema.table_name (FK_CUSTOMER_ID,FK_RUN_START_DATE_ID,FK_RUN_END_DATE_ID,FK_TRAVEL_ID,FK_ORIGIN_ID,FK_DEST_ID,FK_SEGMENT_ID,SEGMENT_PERCENTAGE,LAST_UPDATED) FROM LOCAL ''/my/file/full/path/test1.dat''';

results = exec(conn,sqlstmnt);

但它在results.Message 中给出了错误,例如:

[Vertica]JDBC 预期结果集,但不是从查询“COPY schema.table_name(FK_CUSTOMER_ID,FK_RUN_START_DATE_ID,FK_RUN_END_DATE_ID,FK_TRAVEL_ID,FK_ORIGIN_ID,FK_DEST_ID,FK_SEGMENT_ID,SEGMENT_PERCENTAGE,LAST_UPDATED) FROM LOCAL '/my/file/full/路径/test1.dat'”。查询未执行。

“.dat”文件中的数据按照COPY LOCAL 中提到的列的顺序排列。

我找不到任何有用的资源来解释这个错误。

我有这个 test1.dat 文件,我可以使用 vsql 中的 COPY 插入它,但是由于我在 MATLAB 中运行我的代码并进行了多次迭代,每次迭代产生大约一百万条记录,我想在每次迭代期间插入它们.任何帮助都会非常棒。

【问题讨论】:

    标签: sql matlab bulkinsert vertica


    【解决方案1】:

    COPY 命令返回包含加载数据量的 ResultSet,我看到两个主要选项

    1) 结果 =exec(conn,sqlstmnt);

    2)results = runsqlscript(conn,'nameOfSQLScriptthatIncludeTheCopyCommand.sql')

    希望对你有用

    谢谢

    【讨论】:

    • 哦,对不起,我明确提到它是一个错误。即使我将它作为 results =exec(conn,sqlstmnt); 运行,游标“结果”的消息部分实际上也会给出该错误
    • 你试试第二个选项吗?
    • 第二个选项我也试过了,但我得到了同样的错误。我在 vsql 中使用服务器上的文件尝试了相同的语句,它说“没有正在进行复制”。我在这里的语法中有什么遗漏吗?
    • 请分享您的目标表结构和 CSV 中的一些示例数据
    • 我在这里分享了我的文件sendspace.com/filegroup/wiCoZ8iXLROluEoMM1cknA
    【解决方案2】:

    我刚刚检查完你是你的输入样本数据。 我看到将输入 csv 映射到目标表的主要问题。

    Main issues are :
      1)     Lines  are  broken  into 2 lines ( you should prefer having one  sample per line and avoid brock it into 2 lines )
          Eg :  "1,20150101,0,2,2573,2714,1,8.147237e-01
                50,48,49,54,45,48,51,-28 12:11:46"
    
      2) when you define data types on vertica table ,eg: timestamp the data on the csv must reflect to it ( what you have is "-28 12:11:46" , this will not work )   
    
    
        After you fix all this issues ,  make sure you test it  using vsql , then go and try it with matlab 
    
        I hope you will find it useful.
    

    【讨论】:

    • 实际上,当我从 MATLAB 保存到 '.dat' 文件时,每条备用行都被添加了。它实际上并不存在于变量中。不过,我会尝试将数据保存在“.csv”文件中,然后再试一次。因为我记得上次我在 vsql 上尝试的是 dat 文件中的类似数据。
    • 是的,底线,你需要修复你的 dat 文件
    • 是的,写入 dat 文件时出错。我错过了 fprintf(fid,'%d,%d,%d,%d,%d,%d,%d,%d,%s\n',temp_data{row,:}); 中的一列我在这里分享了正确的数据sendspace.com/file/v3s36d我在更正后尝试过,但仍然是同样的问题。这可能是因为我正在尝试从 Windows(我的笔记本电脑)到 linux 上的服务器吗?
    • 很高兴听到! ,请确保将其标记为解决方案
    • 你的数据包括9列,你的目标表是17列,确保你有完整的地图
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多