2017-01-25 37 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,這可能會有所幫助。

感謝我的項目經理。