2017-01-25 8 views
1

私はtalendの初心者です。 私は、hbaseからデータを読み込み、大きなデータバッチを使用して式ビルダーのデータを変換し、出力をファイルに書き込もうとしています。 enter image description hereTalendのHBaseテーブルから行キーを取得する

は今、私は、テーブルの行キーを入手し、以下のようにそれに変換を適用、

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

したいここで重要なのは、私がデータを描画していますHBaseのテーブルののrowKeyです。

さらに、マッピングタブのスナップショットを添付します。

enter image description here

私は基本的に自分の仕事を実行すると上記の変換cast(cus.key as string)はのrowKeyに適用され、列IDとして格納する必要がありますようにだから、HBaseのテーブルのキーをピックアップする必要があります。

hbaseテーブルからローキーを取得する簡単な方法があるかどうかを知りたいですか?

ありがとうございます。

+0

私はhbaseのプロジェクトで作業しました。私たちがやったのは、別の列を挿入してその中に置くことです。普通の列のように使うことができます。 –

+0

@ThéoCapdetテーブルから行キーを取り出したい。我々はtalendでそれを行う必要があります。 –

+0

最初にhbaseテーブルをロードするときに、あなたの中にあなたのrowkeyをコピーする列を作成する必要があります。 –

答えて

1

まず、Hbaseでデータをロードするときに、(hbaseoutputオプションで)カスタムの行キーを作成する必要があります。

IDフィールドは"key"+user_idのように一意にするために使用できます。

これに従ってください:Here

をあなたがそれを行うと同時に、あなたはrow_key_technical(たとえば)名前の列に同じ値("key"+user_id)今

を保存するあなたのようなのrowKeyを使用することができますあなたのテーブルの通常の列。したがって、ベースラインを使用すると、テクニカル・コラムの行キー・ストアを取得し、必要な処理を実行できます。

あなたは2度に行う必要があります。

私はこれが唯一の解決策であるとは確信していませんが、それは1つです。 Mybe誰かがより良い解決策を持っている;)。

+0

私は古いテーブルから新しいhbaseテーブルを作成したいと思っています!!これは私にとっては不可能です。私はhbaseテーブルから行キーを取得したいだけです。 –

+1

C:\ Program Files(x86)\ Talend-Studio \ studio \ plugins \ org.talend.designer.components.mrprovider_6.2.1でhbaseInputクラスのコードを変更して、hbaseテーブルから行キーを取得する回避策を見つけました。 20160704_1411 \ components \ tHBaseInput –

1

HbaseInputコンポーネントがHbaseテーブルの行キーをフェッチするように強制できます。 以下を実行し、tHbaseInputクラスが存在する場所に移動します。

C:\プログラムファイル (x86の)\才能-Studioの\スタジオ\プラグイン\ 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の)\才能-Studioの\スタジオ\ configuratイオン。 talend open studioを再起動します。 これで、tHbaseInputコンポーネントはHbaseテーブルから行キーをフェッチします。 これはすべてのケースで推奨されるわけではありませんが、talend open studioを使用してジョブを生成し、別の場所にjarファイルをデプロイする場合は参考になります。

私のプロジェクトマネージャーに感謝します。

関連する問題