我们有什么方法可以在短时间内实现写入数据?
提前致谢。
答案 0 :(得分:2)
将其拆分为多个作业,每个作业都会提取数据的不同部分并写入相应的csv文件(地图),然后在完成(合并)后合并csv文件。
如果可以,可以在不同的计算机或一台(多核)计算机上运行作业,并将输出写入不同的磁盘。
答案 1 :(得分:1)
您需要查看数据并使用行键将其分解为不同的部分。 使用行键设置扫描的STARTROW和STOPROW属性。
现在你有了单独的扫描,你可以从不同的盒子中并行运行它们。
Psuedo代码:
OutputStream stream = new FileOutputStream("C:\home\you\csvfiles\mycsvfile1.csv");
BufferedWriter wtrBuffer = new BufferedWriter(new OutputStreamWriter(stream, "UTF-8"));
CSVWriter writer = new CSVWriter(wtrBuffer, ',');
HTable myTable = null;
try {
myTable = new HTable(myConfig, "myTable");
} catch (IOException e) {
e.printStackTrace();
}
for (Result result : scanner) {
if (result != null){
// Just printing the keys because I don't know anything about your data
writer.writeNext(Bytes.toString(result.getRow()));
}
try {
myTable.close();
} catch (IOException e) {
e.printStackTrace();
}
try{
}catch(Exception ex){
ex.printStackTrace();
}
finally {
System.out.println("Writing to disk...");
writer.flush();
writer.close();
stream.flush();
stream.close();
System.out.println("Writing to disk...Complete");
}
此代码使用opencsv:http://opencsv.sourceforge.net
确保为每个扫描过程使用不同的文件名。您可以让每个进程写入共享文件夹/网络存储,或写入本地然后复制到网络存储。 完成所有进程后,如果还没有,可以将所有csv文件(mycsvfile1 ... n.csv)复制到一个目录中。
然后你可以将它们合并到一个文件中。
copy *.csv all.csv
然后打开all.csv,你的文件应该有1000万行。
您也可以使用MR以及在hdfs中写入文件的maponly作业来完成此操作。
答案 2 :(得分:0)
您可以在HBASE表上创建一个简单的外部HIVE表,然后使用配置单元上的select / export命令以CSV格式保存数据。
第1步:
hive> CREATE TABLE mapr_table_1(key int, value string)
> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
> TBLPROPERTIES ("hbase.table.name" = "/user/mapr/xyz");
第2步:从Hive获取数据
INSERT OVERWRITE LOCAL DIRECTORY '/path/to/hive/csv' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT * FROM hivetablename limit 1000000;
答案 3 :(得分:0)
您可以使用apache drill
将输出重定向到CSV文件。 Apache钻头附带mapr软件。
sqlline -u "jdbc:drill:" --outputformat=csv --run=fileWithSQL.sql > Output_CSV_file.csv
将您的查询从fileWithSQL.sql
文件中的habse读取并运行上述命令。
在sqlline中还有其他可以提供帮助的开关。