我是 hadoop 和 hive 的新手,我对hive的insert into
和load data
声明感到困惑。
当我执行INSERT INTO TABLE_NAME (field1, field2) VALUES(value1, value2);
时,hiveserver将执行mapReduce任务。
当我执行LOAD DATA LOCAL INPATH PATH_TO_MY_DATA INTO TABLE TABLE_NAME;
时,它只从文件加载数据而不执行任何其他操作。
我用python编写程序,这是我的问题,如果我使用pyhs2并使用insert
语句来保存数据记录,每条记录都会执行mapReduce任务,而且速度非常慢。
我应该先将数据保存到某个地方,然后使用load data
语句加载它吗?
答案 0 :(得分:3)
<强>加载强> 在将数据加载到表中时,Hive不会进行任何转换。加载操作当前是纯复制/移动操作,可将数据文件移动到与Hive表对应的位置。
插入强>
可以使用insert子句将查询结果插入表中。
INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
在加载文件中复制到表中的所有数据时,在插入中你可以根据某些条件放入数据。
您的解决方案
对于你执行给定hql的每一行,所以每次map reduce run。
如果您想在单个mapreduce中执行查询,那么
INSERT INTO TABLE students
VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);
创建一个查询并执行它。如果您在这种情况下有更多记录,则可以批量生产。
答案 1 :(得分:-2)
INSERT OVERWRITE将覆盖表或分区中的所有现有数据 和INSERT INTO将附加到保持现有的表或分区 数据(ref at apache.org)。