从talend中的hbase表检索行键

2cmtqfgy  于 2021-06-10  发布在  Hbase
关注(0)|答案(2)|浏览(501)

我是个新手。我正在尝试从hbase读取数据,并在expressionbuilder中使用bigdatabatch对数据进行一些转换,然后将输出写入一个文件。

现在我想得到表的行键并对其应用如下转换,

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

这里的key是我从中提取数据的hbase表的rowkey。
我正在附加Map选项卡的快照。

因此,当我基本上运行我的作业时,应该选取hbase表的键,以便执行上述转换 cast(cus.key as string) 应应用于rowkey并存储为列id。
我想知道我们是否有简单的方法从hbase表中获取rowkey?
提前谢谢。

pkwftd7m

pkwftd7m1#

首先,在hbase中加载数据时,需要创建一个自定义rowkey(在hbaseoutput选项中)。
您可以使用一些id字段来使其唯一,如 "key"+user_id .
跟着这个:这里
同时,存储相同的值( "key"+user_id )在您命名的列中 row_key_technical (例如)
现在可以像在表中使用普通列一样使用rowkey。因此,使用thbaseinput,您可以检索技术栏中的rowkey存储并执行任何您想要的操作。
你需要在两次内完成。
我不确定这是唯一的解决办法,但它是一个。可能有人有更好的解决方案;)。

x4shl7ld

x4shl7ld2#

可以强制hbaseinput组件获取hbase表的rowkey。执行以下操作,转到thbaseinput类存在的位置。
c:\program files(x86)\talend studio\studio\plugins\org.talend.designer.components.mrprovider\u 6.2.1.20160704\u 1411\components\thbaseinput
在thbaseinput\u mrcode\u main\u 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开放工作室。现在,thbaseinput组件将从hbase表中获取行键。这可能不适合所有情况,但如果您使用talend open studio生成作业并将jar部署到其他地方,这可能会有所帮助。
多亏了我的项目经理。

相关问题