gpt4 book ai didi

java - 在 java 中比较 TSV 文件和 Hbase 表中的值

转载 作者:可可西里 更新时间:2023-11-01 14:53:13 25 4
gpt4 key购买 nike

我有一个 Hbase 表,它有一个唯一的行键和一个列族和一列。我有一个 TSV 文件,它有大约 300 多列。此文件中的行键是两列的组合值。所以现在我需要比较表和文件中的行键,如果行键匹配,那么我需要插入表列值作为相应行键的 TSV 文件中的最后一列。我写了下面的代码,但是它总是执行else部分。

package mapReduce;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;

public class Tsv_read{

private static Configuration conf = null;

static {
conf = HBaseConfiguration.create();
}

@SuppressWarnings("resource")
public static void main(String[] arg) throws Exception {

BufferedReader TSVFile =
new BufferedReader(new FileReader("Path/to/file/.tsv"));

String dataRow = TSVFile.readLine();
List<String> list = new ArrayList<String>();


while (dataRow != null){
list.clear();
String[] dataArray = dataRow.split("\t");




for (String item:dataArray) {

HTable table = new HTable(conf, "Table name"); //Hbase table name
Scan s = new Scan();
ResultScanner ss = table.getScanner(s);
for(Result r:ss){
for(KeyValue kv : r.raw()){
//System.out.println("Rowkey :" +dataArray[12]+"-"+dataArray[13]);
//System.out.print(new String(kv.getRow()) + " ");
if((dataArray[12]+"-"+dataArray[13]).equals(new String(kv.getRow()))){ //Comparing the rowkeys from file and table (doesn't work)
System.out.println("File Rowkey :"+dataArray[12]+"-"+dataArray[13]);
System.out.println("Table Row key"+new String(kv.getRow()));
//dataArray[392]=new String(kv.getValue());
FileWriter fstream = new FileWriter("/path/to/the/file/*.tsv",true);
BufferedWriter fbw = new BufferedWriter(fstream);
fbw.write(new String(kv.getValue())); //inserting the value to the tsv file
fbw.newLine();
fbw.close();
System.out.println("Column value written succesfully");
}
else //always executes this part
{
System.out.println("RowKey not found :" +new String(kv.getRow()));
}
/*System.out.print(new String(kv.getFamily()) + ":");
System.out.print(new String(kv.getQualifier()) + " ");
System.out.print(kv.getTimestamp() + " ");*/
//System.out.println(new String(kv.getValue()));


list.add(item);
}
}
}
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String txt = it.next();
System.out.print(txt+" ");
}
System.out.println(); // Print the data line.
dataRow = TSVFile.readLine();
}

TSVFile.close();

System.out.println();

} //main()
}

示例记录:

dataArray[12]+"-"+dataArray[13] = 3049620139673452544-5172983457411783096

在Hbase表中,rowkey也有相同格式的值。

我无法共享整个记录,因为它有 300 多列。

TSV 文件大小e:大约 10GB

Hbase 表:大约 10254950 行。

感谢任何帮助。提前致谢。

最佳答案

而不是这样写

if((dataArray[12]+"-"+dataArray[13]).equals(new String(kv.getRow()))){//比较文件和表中的行键(不起作用)

试试这个

if((dataArray[12]+"-"+dataArray[13]).equals(Bytes.toString(kv.getRow()))){

您没有正确获取行值。

试试这个更新后的代码,它使用 Get 而不是从 hbase 扫描,运行时间更短

    while (dataRow != null) {
list.clear();
String[] dataArray = dataRow.split("\t");

for (String item : dataArray) {

String key = dataArray[12] + "-" + dataArray[13];
HTable table = new HTable(conf, "Table name"); // Hbase table
// name
Get get = new Get(Bytes.toBytes(key));
Result r = table.get(get);
if (r != null && r.size() > 0) {
for (KeyValue kv : r.raw()) {
System.out.println("File Rowkey :" + key);
System.out.println("Table Row key"
+ Bytes.toString(kv.getRow()));
FileWriter fstream = new FileWriter(
"/path/to/the/file/*.tsv", true);
BufferedWriter fbw = new BufferedWriter(fstream);
fbw.write(new String(kv.getValue())); // inserting the
// value to the
// tsv file
fbw.newLine();
fbw.close();
System.out.println("Column value written succesfully");
}
} else {
System.out.println("RowKey not found :" + key);
}
list.add(item);
}
}

关于java - 在 java 中比较 TSV 文件和 Hbase 表中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30612979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com