从Talend中的HBase表中检索行键

时间:2017-01-25 12:10:50

标签: hbase talend routines row-key

我是talend的新手。 我试图从hbase读取数据,并使用大数据批处理对表达式构建器中的数据进行一些转换,并将输出写入文件。 enter image description here

现在我想获取表的行键并在其上应用转换,如下所示,

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

这里的key是hbase表的rowkey,我从中绘制数据。

即时附加映射标签的快照。

enter image description here

因此,当我基本上运行我的工作时,应该选择hbase表的键,以便上面的转换cast(cus.key as string)应该应用于rowkey并存储为列id。

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

提前致谢。

2 个答案:

答案 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,这可能会有所帮助。

感谢我的项目经理。