Загрузите данные Json с помощью Pig

Я пытаюсь извлечь данные из приведенного ниже формата json с помощью свиньи, используя jsonLoader():

{"Partition":"10","Key":"618897","Properties2":[{"K":"A","T":"String","V":"M "}, {"K":"B","T":"String","V":"N"}, {"K":"D","T":"String","V":"O"}]}
{"Partition":"11","Key":"618900","Properties2":[{"K":"A","T":"String","V":"W”"},{"K":"B","T":"String","V":"X"}, {"K":"C","T":"String","V":"Y"},{"K":"D","T":"String","V":"Z"}]}

Прямо сейчас я могу извлечь данные из «раздела», «ключа» и «V» для каждого объекта массива с помощью следующего кода:

A= LOAD '/home/hduser/abc.jon' Using JsonLoader('Partition:chararray,Key:chararray,Properties2:{(K:chararray,T:chararray,V:chararray)},Timestamp:chararray');
B= foreach A generate $0,$1,BagToString(Properties2.V,'\t') as vl:chararray; 
store B into './Result/outPut2';

Из приведенного выше кода я получаю значение массива Properties2 на основе последовательности, а не столбца, это создает проблему всякий раз, когда последовательность изменяется или появляется новый объект. Пожалуйста, помогите мне извлечь данные на основе столбца (значения K).

Мой вывод введите здесь описание изображения

Ожидаемый результат введите здесь описание изображения

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


person Vikram Singh Chandel    schedule 06.02.2015    source источник


Ответы (1)


У вас есть два варианта здесь

1. Используйте elephant-bird, который даст вам карту ключа и значения.

A = LOAD '/apps/pig/json_sample' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') as (json:map[]);
B = FOREACH A GENERATE json#'Partition',json#'Key',json#'Properties2';
dump B;

даст вам вывод:

(10,618897,{([T#String,K#A,V#M ]),([T#String,K#B,V#N]),([T#String,K#D,V#O])})
(11,618900,{([T#String,K#A,V#W”]),([T#String,K#B,V#X]),([T#String,K#C,V#Y]),([T#String,K#D,V#Z])})

Или вам нужно написать собственный загрузчик, который должен это делать

а). Он должен знать, каков правильный порядок значений, которые будут приходить для ключа K.

b). Просмотрите каждое из этих значений и посмотрите, отсутствует ли в json какой-либо из этих ключей, и верните пустой/нулевой символ для этого местоположения.

Я публикую метод getNext() CustomJsonLoader, который будет делать то же самое:

@Override
public Tuple getNext() throws IOException {
    // TODO Auto-generated method stub
    try {
        boolean notDone = in.nextKeyValue();
        if (!notDone) {
            return null;
        }
        Text value = (Text) in.getCurrentValue();
        List<String> valueList = new ArrayList<String>();
        if (value != null) {

            String jsonString = value.toString();
            System.out.println(jsonString);
            JSONParser parser = new JSONParser();
            JSONObject obj = null;
            try {
                obj = (JSONObject) parser.parse(jsonString);
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("obj is "+obj);
            if (obj != null) {
                String partition = (String) obj.get("Partition");
                String key = (String) obj.get("Key");
                valueList.add(partition);
                valueList.add(key);
                JSONArray innArr = (JSONArray) obj.get("Properties2");
                char[] innKeys = new char[] { 'A', 'B', 'C', 'D' };
                Map<String,String> keyMap = new HashMap<String,String>();
                for (Object innObj : innArr) {
                    JSONObject jsonObj = (JSONObject) innObj;
                    keyMap.put(jsonObj.get("K")+"",jsonObj.get("V")+"");
                }
                for (int i = 0; i < innKeys.length; i++) {
                    char ch = innKeys[i];
                    if (keyMap.containsKey(ch+"")) {
                        valueList.add(keyMap.get(ch+""));
                    }else{
                        valueList.add("");
                    }

                }
                Tuple t = tupleFactory.newTuple(valueList);
                return t;
            }
        }

        return null;
    } catch (InterruptedException e) {
    }
}

и зарегистрируйте его и запустите:

REGISTER udf/CustomJsonLoader.jar
A = LOAD '/apps/pig/json_sample' USING CustomJsonLoader();
DUMP A;
(10,618897,M,N,,O)
(11,618900,W,X,Y,Z)

Надеюсь это поможет!

person vishnu viswanath    schedule 08.02.2015
comment
Большое спасибо за ваше время и усилия, я попробовал с птицей-слоном. Я получил тот же результат, что и опубликованный, но не смог получить значения на основе столбца (на основе значения K). Я новичок в свиньях, и часть udf для меня немного сложна, не могли бы вы помочь мне с предварительными условиями для customjsonLoader, такими как jar и код. - person Vikram Singh Chandel; 09.02.2015
comment
arunxjacob.blogspot.in/2010/12/writing-custom- pig-loader.html это очень простой блог, который я изначально использовал для создания пользовательского загрузчика. Написание функций udf/loader/store для pig легко, если вы знаете java. - person vishnu viswanath; 09.02.2015
comment
Спасибо за ответ, я просмотрел блог, который вы предложили, и с помощью вашего данного я подготовил собственный загрузчик, но он не работает. Когда я выполняю свой сценарий свиньи, возникает следующая ошибка: ОШИБКА 1070: не удалось разрешить Custome с помощью импорта: [, java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.] на org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:196) на org.apache .pig.PigServer$Graph.parseQuery(PigServer.java:1676) в org.apache.pig.PigServer$Graph.access$000(PigServer.java:1409) ..... - person Vikram Singh Chandel; 09.02.2015
comment
похоже, что ваша регистрация udf не удалась. Убедитесь, что файл класса расширяет LoadFunc, а файл jar доступен по пути, который вы указали при регистрации. - person vishnu viswanath; 09.02.2015
comment
да, я расширил свой класс из класса LoadFunc, и мой файл jar также находится в правильном пути, я думаю, что что-то не так с моим кодом, не могли бы вы проверить мой код, я не могу опубликовать его здесь из-за ограничения текста. - person Vikram Singh Chandel; 09.02.2015
comment
можете ли вы поделиться командой, используемой для регистрации, вашим именем пакета и класса, а также командой, используемой для использования udf - person vishnu viswanath; 09.02.2015
comment
Давайте продолжим это обсуждение в чате. - person Vikram Singh Chandel; 09.02.2015