Получение ключа строки из таблицы HBase в Talend

Я новичок в календаре. Я пытаюсь прочитать данные из hbase и сделать некоторые преобразования данных в построителе выражений, используя большой пакет данных и записать вывод в файл.

Теперь я хочу получить ключ строки таблицы и применить к ней преобразования, как показано ниже,

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

Здесь ключ - это строка строки таблицы hbase, из которой я рисую данные.

И я прилагаю снимок вкладки сопоставления.

Поэтому, когда я в основном выполняю свою работу, ключ таблицы hbase должен быть подобран так, чтобы приведенное выше преобразование cast(cus.key as string) должен быть применен к ключу строки и сохранен как идентификатор столбца.

Я хочу знать, есть ли у нас какой-нибудь простой способ получить ключ строки из таблицы hbase?

Заранее спасибо.

2 ответа

Вы можете заставить свой компонент HbaseInput извлекать ключ строки из таблицы Hbase. Сделайте следующее, перейдите в место, где у вас есть класс tHbaseInput.

C: \ Program Files (x86) \ Talend-Studio \ studio \ plugins \ org.talend.designer.components.mrprovider_6.2.1.20160704_1411 \ components \ tHBaseInput

И в классе java jet tHBaseInput_mrcode_main_only, будет метод 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()%>"))

После этого удалите файл "ComponentsCache.javacache" в C:\Program Files (x86)\Talend-Studio\studio\configuration. И перезапустите открытую студию Talend. Теперь ваш компонент tHbaseInput будет извлекать ключ строки из таблицы Hbase. Это может быть нежелательным для каждого случая, но если вы используете talend open studio для создания заданий и развертывания jar-файлов в другом месте, это может быть полезно.

Спасибо моему менеджеру проекта.

Прежде всего, вам нужно создать пользовательский ключ строки (в опции hbaseoutput) при загрузке данных в Hbase.

Вы можете использовать поле идентификатора, чтобы сделать его уникальным, как "key"+user_id,

Следуйте этому: здесь

В то же время вы делаете то же самое значение ("key"+user_id) в столбце, который вы называете row_key_technical (например)

Теперь вы можете использовать rowkey как обычный столбец в вашей таблице. Таким образом, используя thbaseinput, вы можете получить хранилище ключей в технической колонке и делать все, что захотите.

Вам нужно сделать это в два раза.

Я не уверен, что это единственное решение, но оно одно. Возможно, у кого-то есть лучшее решение;) .

Другие вопросы по тегам