我是talend的新手。 我试图从hbase读取数据,并使用大数据批处理对表达式构建器中的数据进行一些转换,并将输出写入文件。
现在我想获取表的行键并在其上应用转换,如下所示,
(concat('-',cast(cus.key as string))) as id
这里的key是hbase表的rowkey,我从中绘制数据。
即时附加映射标签的快照。
因此,当我基本上运行我的工作时,应该选择hbase表的键,以便上面的转换cast(cus.key as string)
应该应用于rowkey并存储为列id。
我想知道我们是否有任何简单的方法从hbase表中获取rowkey?
提前致谢。
答案 0 :(得分:1)
首先,当您在Hbase中加载数据时,需要创建自定义rowkey(在hbaseoutput选项中)。
您可以使用某些ID字段,使其像"key"+user_id
一样独特。
请遵循:Here
在您这样做的同时,将相同的值("key"+user_id
)存储在您命名为row_key_technical
的列中(例如)
现在,您可以像表格中的普通列一样使用rowkey。因此,使用thbaseinput,您可以在技术专栏中检索rowkey商店并执行任何操作。
你需要两次这样做。
我不确定这是唯一的解决方案,但它是唯一的解决方案。 Mybe有人有更好的解决方案;)。
答案 1 :(得分:1)
您可以强制HbaseInput组件获取Hbase表的rowkey。 执行以下操作,转到存在tHbaseInput类的位置。
C:\ Program Files (86)\了Talend工作室\工作室\插件\ org.talend.designer.components.mrprovider_6.2.1.20160704_1411 \部件\ tHBaseInput
在tHBaseInput_mrcode_main_only java jet类中, 将有一个方法validateResult(),如下所示
public boolean validateResult(org.apache.hadoop.hbase.client.Result result,
<%=recordStruct%> value) throws IOException {
org.apache.hadoop.hbase.io.ImmutableBytesWritable rowKey = new org.apache.hadoop.hbase.io.ImmutableBytesWritable();
rowKey.set(result.getRow());
lastSuccessfulRow = rowKey.get();
byte[] rowResult = null;
String temp = null;
<%
for (int i = 0; i < mapping.size(); i++) {
Map<String, String> map = mapping.get(i);
String family_column= map.get("FAMILY_COLUMN");
IMetadataColumn column = mainColumns.get(i);
String columnName = column.getLabel();
String defaultValue = column.getDefault();
String typeToGenerate = JavaTypesManager.getTypeToGenerate(column.getTalendType(), column.isNullable());
JavaType javaType = JavaTypesManager.getJavaTypeFromId(column.getTalendType());
String patternValue = column.getPattern() == null || column.getPattern().trim().length() == 0 ? null : column.getPattern();
boolean isPrimitiveType = JavaTypesManager.isJavaPrimitiveType(javaType, column.isNullable());
String toAssign = "value." + columnName;
%>
rowResult = result.getValue(
org.apache.hadoop.hbase.util.Bytes.toBytes(<%=family_column%>),
org.apache.hadoop.hbase.util.Bytes.toBytes("<%=column.getOriginalDbColumnName()%>"));
temp = org.apache.hadoop.hbase.util.Bytes.toString(rowResult);
Modify the above method to below
public boolean validateResult(org.apache.hadoop.hbase.client.Result result,
<%=recordStruct%> value) throws IOException {
org.apache.hadoop.hbase.io.ImmutableBytesWritable rowKey = new org.apache.hadoop.hbase.io.ImmutableBytesWritable();
rowKey.set(result.getRow());
lastSuccessfulRow = rowKey.get();
byte[] rowResult = null;
String temp = null;
value.key = org.apache.hadoop.hbase.util.Bytes.toString(lastSuccessfulRow);
<%
for (int i = 0; i < mapping.size(); i++) {
Map<String, String> map = mapping.get(i);
String family_column= map.get("FAMILY_COLUMN");
IMetadataColumn column = mainColumns.get(i);
String columnName = column.getLabel();
String defaultValue = column.getDefault();
String typeToGenerate = JavaTypesManager.getTypeToGenerate(column.getTalendType(), column.isNullable());
JavaType javaType = JavaTypesManager.getJavaTypeFromId(column.getTalendType());
String patternValue = column.getPattern() == null || column.getPattern().trim().length() == 0 ? null : column.getPattern();
boolean isPrimitiveType = JavaTypesManager.isJavaPrimitiveType(javaType, column.isNullable());
String toAssign = "value." + columnName;
%>
if(!"key".equalsIgnoreCase("<%=column.getOriginalDbColumnName()%>"))
完成后,删除C:\ Program Files(x86)\ Talend-Studio \ studio \ configuration中的“ComponentsCache.javacache”文件。 并重新启动talend open studio。 现在,您的tHbaseInput组件将从Hbase表中获取行键。 这可能不适用于所有情况,但如果您使用talend open studio生成作业并在其他地方部署jar,这可能会有所帮助。
感谢我的项目经理。