2017-01-25 35 views
1

我是一个新手。 我试图从hbase中读取数据,并使用大数据批量对表达式生成器中的数据进行一些转换,并将输出写入文件。 enter image description here从Talend的HBase表中检索行密钥

现在我想表的行键并在其上应用变换像下面,

(concat('-',cast(cus.key as string))) as id 

这里关键的是我敢从图纸数据HBase的表的rowkey。

并附加映射选项卡的快照。

enter image description here

所以当我基本上运行我的工作,HBase的表的关键字应该拿起使得上述改造cast(cus.key as string)应在rowkey应用,并为一列ID存储。

我想知道我们是否有任何简单的方法从hbase表中获取rowkey?

在此先感谢。

+0

我使用hbase工作过一个项目,我们所做的是插入另一列并将rowkey放入。因此,您可以像普通列一样使用它 –

+0

@ThéoCapdet我想从表中选取rowkey。如何我们应该怎样去做。 –

+0

当你第一次加载你的hbase表时,你需要创建一个你在里面复制rowkey的列。 –

回答

1

首先,当您在Hbase中加载数据时,您需要创建自定义rowkey(在hbaseoutput选项中)。

您可以使用某些ID字段,以使它与"key"+user_id一样独特。

按照这样的:Here

在你这样做的同时,存储在列中的值相同("key"+user_id),您的名字row_key_technical(例如)

现在你可以使用rowkey像正常列在你的表中。因此,使用thbaseinput,您可以在技术专栏中检索rowkey存储并执行任何您想要的操作。

你需要两次做。

我不确定这是唯一的解决方案,但它是一个。 Mybe有人有更好的解决方案;)。

+0

你想要我从旧桌子创建一个新的HBG表!这对我来说是不可能的。我只想从hbase表中检索行键。 –

+1

我找到了一种解决方法,通过在C:\ Program Files(x86)\ Talend-Studio \ studio \ plugins \ org.talend.designer.components.mrprovider_6.2.1中更改hbaseInput类的代码来从HBase表中检索行密钥。 20160704_1411 \部件\ tHBaseInput –

1

您可以强制您的HbaseInput组件获取Hbase表的rowkey。 执行以下操作,转到tHbaseInput类存在的位置。

C:\ Program Files文件 (x86)的\拓蓝工作室\工作室\插件\ org.talend.designer.components.mrprovider_6.2.1.20160704_1411 \组件\ tHBaseInput

而在tHBaseInput_mrcode_main_only的java类喷, 将会有一个方法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 “ComponentsCache.javacache”:\程序文件(x86)\拓蓝工作室\工作室\ configurat离子。 然后重新启动talend open studio。 现在您的tHbaseInput组件将从Hbase表中获取行键。 对于每种情况,这可能不是明智之举,但如果您使用talend open studio生成作业并在其他地方部署jar,这可能会有所帮助。

感谢我的项目经理。