2017-01-12 3 views
3

Я сохраняю сообщения json для каждого обновления строки из источника oracle в S3. структуры JSON как нижеSpark SQL расширяет массив до нескольких столбцов

{ 
    "tableName": "ORDER", 
    "action": "UPDATE", 
    "timeStamp": "2016-09-04 20:05:08.000000", 
    "uniqueIdentifier": "31200477027942016-09-05 20:05:08.000000", 
    "columnList": [{ 
     "columnName": "ORDER_NO", 
     "newValue": "31033045", 
     "oldValue": "" 
    }, { 
     "columnName": "ORDER_TYPE", 
     "newValue": "N/B", 
     "oldValue": "" 
    }] 
} 

Я использую искры SQL, чтобы найти последнюю запись для каждого ключа на основе максимального значения для уникального идентификатора. columnList - массив со списком столбцов для таблицы. I хотите объединить несколько таблиц и получить последние записи. Как я могу присоединиться к столбцам из массива json из одной таблицы с столбцами из другой таблицы. Есть ли способ взорвать массив json в несколько столбцов. Например, выше json будет иметь ORDER_NO как один столбец, а ORDER_TYPE - как другой столбец. Как создать кадр данных с несколькими столбцами на основе поля columnName Например, для нового RDD должны быть столбцы (tableName, action, timeStamp, uniqueIdentifier, ORDER_NO, ORDER_NO) Значение поля ORDER_NO и ORDER_NO должно отображаться из поля newValue в json.

ответ

0

нашел решение для этого, программно создать схему с помощью RDD Apis

Dataset<Row> dataFrame = spark.read().json(inputPath); 
    dataFrame.printSchema(); 
    JavaRDD<Row> rdd = dataFrame.toJavaRDD(); 
    SchemaBuilder schemaBuilder = new SchemaBuilder(); 
    // get the schema column names in appended format 
    String columnNames = schemaBuilder.populateColumnSchema(rdd.first(), dataFrame.columns()); 

SchemaBuilder является пользовательским классом, созданный, который принимает деталь РДДА и вернуть разделитель разделенных имен столбцов. Затем, используя вызов RowFactory.create, значения json отображаются в схему. Doc reference http://spark.apache.org/docs/latest/sql-programming-guide.html#programmatically-specifying-the-schema