我必须在c#中编写一个从文件中读取数十亿条记录的应用程序,然后通过IMPALA ODBC在Impala表上写入记录。我已经尝试使用带参数
的单个语句执行插入查询INSERT INTO table VALUES (?,?,.....,?)
或使用多个插页:
INSERT INTO table VALUES (?,?,.....,?),(?,?,.....,?),...,(?,?,.....,?)
但是第一个非常慢并且在hdfs上为每个记录创建一个文件;第二个更快但查询很长,对于数十亿条记录,我收到以下错误:
[Cloudera] [SQLEngine](31580)陈述的长度超过最大值:16384。
考虑到我必须使用c#作为我的应用程序的语言,有人可以解决我的问题。
由于
答案 0 :(得分:0)
我认为你需要采用不同的方法来做到这一点。即不要通过C#读取CSV只是为了将值发送到服务器。而是针对服务器发出命令以便为您读取文件。
首先,在数据库中为CSV文件创建一个表。您决定是否需要以编程方式或通过工具完成。然后使用LOAD DATA
语句将CSV读入新表。然后使用INSERT INTO SELECT ...
语句来操作新创建的表。
伪代码示例:
CREATE TABLE DataHeap(whatever the structure of your CSV is)
LOAD DATA INPATH 'HDFS-PATH-TO-CSV-FILE' INTO TABLE DataHeap
INSERT INTO YOUR-DESTINATION-TABLE SELECT whatever FROM DataHeap WHERE ...